关于运算优先级的式子
#include <stdio.h>int main(void)
{
int a,b;
a = 9;
b = (++a)+(++a);
printf("%d",b);
return 0;
}
中为什么计算出来的结果b=22?不应该是20?
本帖最后由 大裤衩子 于 2020-10-8 16:52 编辑
我的理解
#include <stdio.h>
int main(void)
{
int a = 9;
++a; // 10 // 第一次调用++a 此时 a== 10
++a; // 11 // 第二次调用++a 此时 a== 11; 注意:同时第一次++a的值被也为11。
printf("%d\n",a);
//printf("%d\n",(++a)+(++a));// 即 11 + 11 = 22
return 0;
}
大裤衩子 发表于 2020-10-8 16:47
我的理解
????那是遵循什么运算规则吗??? 烂冬瓜狮子头 发表于 2020-10-8 17:01
????那是遵循什么运算规则吗???
++a 先运算再赋值的 ++a 是自增,后运算;
a++ 是运算,后自增;
() 的运算高于 + 号,所以是先对两个括号里进行运算,最后才运算中间那个加号:
(++a) 第一个括号运算后 = 10,(++a) 第二个括号运算后 =11,(++a) + (++a) = 11 + 11 = 22 这么久没见你结帖,你是对加加减减运算不熟悉吧?给你一个程序,运行试试看
#include<stdio.h>
int main()
{
int j = 3,i = 5;
printf("j = 3,i = 5\n");
printf("\n");
j = j * (i++);
printf("j = j * (i++) 运算后的结果是:%d, %d",j,i);
printf(" // 先运算,再自加");
printf("\n");
j = 3,i = 5;
printf("\n");
j = j * (i--);
printf("j = j * (i--) 运算后的结果是:%d, %d",j,i);
printf(" // 先运算,再自减");
printf("\n");
j = 3,i = 5;
printf("\n");
j = j * (++i);
printf("j = j * (++i) 运算后的结果是:%d, %d",j,i);
printf(" // 先自加,再运算");
printf("\n");
j = 3,i = 5;
printf("\n");
j = j * (--i);
printf("j = j * (--i) 运算后的结果是:%d, %d",j,i);
printf(" // 先自减,再运算");
printf("\n");
j = 3,i = 5;
printf("\n");
j = j * (+i);
printf("j = j * (+i)运算后的结果是:%d, %d",j,i);
printf(" // 保持符号再运算");
printf("\n");
j = 3,i = 5;
printf("\n");
j = j * (-i);
printf("j = j * (-i)运算后的结果是:%d, %d",j,i);
printf(" // 改变符号再运算\n");
printf("\n");
printf("单一的 i+ 或单一的 i- // 没有意义,并且系统会报错\n");
printf("\n");
} 从应用角度来看这种问题真的没有任何意义,奇怪的是大学里的C语言考试一定会有这样的题,真是让人无语。
你只需要知道++a 和 a++ 有什么不同就好了,实际应用的时候不要用这种运算写复杂表达式
不确定优先级的时候就加括号
本应该是编译器干的事情就不要过多的投入精力 本帖最后由 风过无痕1989 于 2020-10-10 21:48 编辑
你只需要知道++a 和 a++ 有什么不同就好了,实际应用的时候不要用这种运算写复杂表达式
产生这个问题的原因有两方面:
1、是新手刚进入论坛,不懂论坛的规则,担心选择最佳答案会扣除他本人的荣誉或经验什么的,导致他们得到最佳答案后,不愿意去结帖;
2、是论坛版主不给力,没有及时地帮助新手们结帖,于是就导致大家以为他没有获得最佳答案,一个个地进来回复帖子,造成人力物力的极大浪费。其实只要论坛版主及时地帮助他们结帖了,发帖者也会有一个正确的导向,如果他还没有想明白他的问题,他应该会思考,他之前所学的,是否出现了误差,于是对照结帖给出的正确答案,也可以帮助他叫正他之前对概念的一些错误理解 真是非常感谢大家,我已经解决了问题,同时也有了更多的思考,这几天也在忙很多的事情,没有结帖很抱歉。
页:
[1]