关于C/C++中i=2时,(++i)+(++i)+(++i)+(++i)的计算结果引申出的疑问

非计算机专业的老师讲到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