fairylee83 发表于 2017-12-21 16:31:50

关于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:37:26

本帖最后由 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

最后,强烈不推荐这样写代码,一是不同编译器可能会输出不同结果,二是代码可读性极差

fairylee83 发表于 2017-12-21 16:42:24

BngThea 发表于 2017-12-21 16:37
首先回答 q = (++j)+(++j); 为什么是14
因为会先执行两个括号里面的自增,得到 j==7
所以结果为14


受教了,谢谢大神,回复真快~!{:5_91:}

fairylee83 发表于 2017-12-21 16:50:33

BngThea 发表于 2017-12-21 16:37
首先回答 q = (++j)+(++j); 为什么是14
因为会先执行两个括号里面的自增,得到 j==7
所以结果为14


也就是说优化是指q = (++j)+(++j)+(++j),不同时执行三个括号里的自增,j==8,q=8+8+8=24,先对两个结合运算之后再自增,对吧?

BngThea 发表于 2017-12-21 17:01:09

fairylee83 发表于 2017-12-21 16:50
也就是说优化是指q = (++j)+(++j)+(++j),不同时执行三个括号里的自增,j==8,q=8+8+8=24,先对两个结合运 ...

你可以这样理解
编译器的行为有时候并不会像你想象的那样

tdcq的故事 发表于 2021-1-10 16:39:57

BngThea 发表于 2017-12-21 16:37
首先回答 q = (++j)+(++j); 为什么是14
因为会先执行两个括号里面的自增,得到 j==7
所以结果为14


请问为什么 q = (++j)+(++j)=14,不应该是6+6=12吗?
页: [1]
查看完整版本: 关于j=5,q=(++j)+(++j)+(++j)得22的问题