关于j=5,q=(++j)+(++j)+(++j)得22的问题
各位大神,int j=5,q;q = (++j)+(++j)+(++j);
printf("%d,%d\n",q,j);
为什么q是22而不是21呢?
我的算法是q=6+7+8
我算了一下int j=5,q;
q = (++j)+(++j);
printf("%d,%d\n",q,j);
这里q是14而不是q=6+7=13。
算不明白了{:5_100:} 本帖最后由 BngThea 于 2017-12-21 16:38 编辑
首先回答 q = (++j)+(++j); 为什么是14
因为会先执行两个括号里面的自增,得到 j==7
所以结果为14
然后来看 q = (++j)+(++j)+(++j); 为什么是22
因为编译器会自作聪明的进行“优化”
先将某两个进行结合 q = (++j)+ ((++j)+(++j));
完成两个里面的计算得到 j = 7,q = (++j) + 14;
所以结果为22
最后,强烈不推荐这样写代码,一是不同编译器可能会输出不同结果,二是代码可读性极差 BngThea 发表于 2017-12-21 16:37
首先回答 q = (++j)+(++j); 为什么是14
因为会先执行两个括号里面的自增,得到 j==7
所以结果为14
受教了,谢谢大神,回复真快~!{:5_91:} BngThea 发表于 2017-12-21 16:37
首先回答 q = (++j)+(++j); 为什么是14
因为会先执行两个括号里面的自增,得到 j==7
所以结果为14
也就是说优化是指q = (++j)+(++j)+(++j),不同时执行三个括号里的自增,j==8,q=8+8+8=24,先对两个结合运算之后再自增,对吧? fairylee83 发表于 2017-12-21 16:50
也就是说优化是指q = (++j)+(++j)+(++j),不同时执行三个括号里的自增,j==8,q=8+8+8=24,先对两个结合运 ...
你可以这样理解
编译器的行为有时候并不会像你想象的那样 BngThea 发表于 2017-12-21 16:37
首先回答 q = (++j)+(++j); 为什么是14
因为会先执行两个括号里面的自增,得到 j==7
所以结果为14
请问为什么 q = (++j)+(++j)=14,不应该是6+6=12吗?
页:
[1]