//下面这段是百度来的。
做类似(++n)运算是直接在内存中完成的,相当于是用汇编里的自加运算,直接修改内存中n的值. 因此,做第一次(++i)后,i=4,做第二个(++i)后,i=5;此时才做第一次括号外的加法,并把结果保存在临时变量中temp=10;而此时内存中的i已经是5了. 然后在做一次(++i),即i=6;此时i与临时变量temp相加,就是最终结果k=16.不信,你可再加一个(++i),此时,i=7;结果k为23.所以,这样完全可以推出它的运算机制.
有点懵,我用的vc++6.0
vs2008以上版本就会解决这个问题,答案会是24
好吧
给你一个详细的过程吧,看你还是有点懵。首先执行指令都是从右往左执行(下面的分析就是从右往左执行),当然针对你疑问,从左往右执行逻辑也一样。
1、(++i) + (++i) = 14,因为会取加数和被加数,此时++i优先级高,使得i=7,然后相加
2、(++i) + (++i) +(++i) =22,首先取最右边的两个,同1步骤结果是14,此时编译器会再次检测到+号,会将14存储在临时变量里,当前i=7,然后加上最左边的i,此时i要自加了为8,即临时变量14+8=22。
3、(++i) + (++i) +(++i) + (++i) =31,首先取最右边的两个,结果是14,此时编译器会再次检测到+号,会将14存储在临时变量里,当前i=7,然后加上左边的一个i(从左往右数第二个i),此时i要自加了,即临时变量14+8=22。编译器会再次检测到+号,即将结果22存在临时变量里,当前i=8,然后加上最左边的i,此时i要自加了为9,即临时变量22+9=31.
4、同理(++i) + (++i) +(++i) + (++i) +(++i)=10+9+8+7+7=41
5、(++i) + (++i) +(++i) + (++i) +(++i)+(++i)=11+10+9+8+7+7=52
6、xxxxxxx=12+11+10+9+8+7+7=64
7、xxxxxxxx=13+12+11+10+9+8+7+7=77
.
.
.
总结,出现以上的结果是因为在执行的指令的时候,严格按照从右往左取的逻辑,不会优先执行全部的前自加,导致当取到运算符的时候(此题运算符为+号),会将结果存在临时变量里。vs2008版本的逻辑就跟上面不一样,他会先执行完全部的前自加,然后在执行运算符号。也就是我之前说的(++i) + (++i) +(++i)=8+8+8=24
i=5;
第一个i++:i=i+1,等于6
第二个i++:i=i+1,等于7
第三个i++:i=i+1,等于8
j=(++i) + (++i) + (++i)应该等于8+8+8=24;
但是编译器组合问题,就出现了21.
题主没必要纠结这种结果,本身做这个运算就没有必要,祝好
2019-02-21
它可以是6+7+8=21
也可以是7+7+8=22
也可以是8+8+8=24
以上全都可以成立的,本来就是一个BUG
图中的结果是第一个i递增,然后第二个i递增,i这个时候变成了7
7+7=14
然后最后一次i递增,i变成了8,7+7+8=22
但是数学中应当先算括号的,也就是8+8+8=24