非计算机专业的老师讲到C/C++中,i=2时,(++i)+(++i)+(++i)+(++i)的计算结果的时候,给出的答案是19。我感到很困惑,按照正常的计算逻辑结果应该是18,于是我到菜鸟教程的在线编译器上面试了一下,得到的结果是18,后来又在Xcode上试了一次,得到的结果也是18,更换了ACM竞赛专用的codeblocks编译,结果是19。
贴出代码:
#include "stdio.h"
int main() {
int i=2;
int sum=(++i)+(++i)+(++i)+(++i);
printf("%d\n", sum);
}
由此产生了一个疑问,是什么样的原因导致了这个差异?计算出19的计算逻辑又是怎样的?
感觉是编译器的问题,但这个编译器在数值计算上为什么会导致这个差异,希望大佬能解答一下这个问题产生的深层原理。
正确的答案应该是这个,在思否上得到的解答:https://segmentfault.com/q/1010000018570689
理论上应该是18的,不知道19怎么算出来的
sum=(++i)+(++i)+(++i)+(++i);
printf("%d\t%d\n\n", sum,i);
i = 2;sum = 0;
printf("%d\t%d\n", sum,i);
sum = (++i) + sum;
printf("%d\t%d\n", sum,i);
sum = (++i)+sum;
printf("%d\t%d\n", sum,i);
sum = (++i)+sum;
printf("%d\t%d\n", sum,i);
sum = (++i)+sum;
printf("%d\t%d\n", sum,i);
19 6
0 2
3 3
7 4
12 5
18 6
这个问题应该是精度不同影响的,不同的编译器的选用的精度不同,就有可能造成这个现象。就和之前的显示一样。一口气输出的话就是19,一次一次分开计算的话就是18,这也是一个体现。每次有点小误差分开计算的时候可以忽略,但是一口气计算的,这些小误差就会累计,在取舍的时候就有可能会加一。
运算规则:小括号优先级最高,都是加法运算 所以从左到右计算
(++2)+(++i)+(++i)+(++i) i=2
= 3 +(++3)+(++i)+(++i) i=3
= 3 + 4 +(++4)+(++i) i=4
= 3+4+5+(++5) i=5
=3+4+5+6
=18