#include <stdio.h>
int main()
{
int a = 3, b, c;
b = (a++) + (a++) + (a++);
printf("%d,%d\n", a, b);
c = (++a) + (++a) + (++a);
printf("%d,%d\n", a, c);
}
救命,c为什么是25?
c = (++a) + (++a) + (++a);
8+8=16+(++a) = 16+9 =25
先计算第一个++a,再计算第二++a,然后相加,再加上(++a);
不用救命,写这种代码本身很无聊,项目中谁这写我弄死他。不同编译器的解释不一样,没啥纠结的
b = (a++) + (a++) + (a++);
先计算
b = a + a +a = 9;
然后计算3次a++(a=6)
c = (++a) + (++a) + (++a);
先计算三次a++(a=9,上一个b那里a已经计算了3次++,a=6,这里再自加3次,就是9)
然后计算c=a+a+a=27
25是错误的,结果是27
visual studio 2008运行结果如下:
之所以先将前两个++a先+之后,再和++a相加,是因为C语言是直接编译成汇编指令执行的,而cpu寄存器数量是有限的,++a的操作只能在ax寄存器和cx寄存器中保存,dx寄存器是用来计算加法和减法的,由于寄存器的限制,所以它出现两个++操作时,只能先将这两个++操作之间的操作执行了,因为它无法保存多个++a的值,在其他高级语言中,由于不是直接转化成汇编的,所以可以保存多个++的值,而go语言中b=++a;这种语句会保存,不允许这么去写,只能++i;b=i这样去用。由于c是直接转化成汇编指令,JavaScript是解释型语言,所以JavaScript中多个++i和C中多个++i获得的值是不一样的,JavaScript中多个++i获得的值和我们预期的是一样的