这个运算式看不懂,请教大神说明下运算顺序
int i = 5,j = 5,p,q;p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
结果输出是15,22,8,8 i++ 是用了之后再自增,所以是 p = i + i + i = 15之后 i再自增,重复三次 ,所以 i = 8;
++j 是自增之后再用,所以 q = (j+1) + (j+1) + (j+1) = 18,j = 8. °蓝鲤歌蓝 发表于 2017-12-20 21:39
i++ 是用了之后再自增,所以是 p = i + i + i = 15之后 i再自增,重复三次 ,所以 i = 8;
++j 是自增之后 ...
第二个发错了,q = 6 + 7 + 8 = 21 多重自增运算在不同的编译器下得到的不同的结果
因为编译器会自作聪明的优化代码,导致执行顺序完全不是你想的那样
更重要的是可读性极差
所以不建议这么写代码 楼上就正解了,不同编译器的结果是不同的,没必要纠结。
就这道题关于 q 运算的优先级最后结果有的是 22 ,有的是 24,我用 java 是21。(C 一直没安装成功) °蓝鲤歌蓝 发表于 2017-12-20 21:39
i++ 是用了之后再自增,所以是 p = i + i + i = 15之后 i再自增,重复三次 ,所以 i = 8;
++j 是自增之后 ...
但是++是在括号里面,不是应该先运算括号里面的吗,还有那个j+1,赋值是有顺序的?即是说q=(5+1)+(6+1)+(7+1)这样?一般的赋值顺序是从左到右? A529231559 发表于 2017-12-21 00:09
但是++是在括号里面,不是应该先运算括号里面的吗,还有那个j+1,赋值是有顺序的?即是说q=(5+1)+(6+1 ...
在括号里面它也要先使用 i 之后才自增啊,不会因为(i++)就 先自增再使用的。
说了是编译器不同的原因,编译器对这道题判定的优先级不一样,所以结果不一样啊。
21 就是 6 + 7 + 8啊,
22 就是 7 + 7 + 8 。就相当于 q = ((++j)+(++j)) + (++j)
还有的是 24 ,就是 8 + 8 + 8 好的,明白了,谢谢大神
页:
[1]