int main()
{
int a = 5;
int b = 0;
b = (a++)*(a++);
printf("b:%d\n", b);
return 0;
}
结果是25
为什么不是30呢,因(a++)*(a++)是一个乘法表达式,(a++)处理需要两条指令,第一条是获取a的值,++在第二条指令,而这个表达式在(a++)第一条指令就已经获取到值,所以++操作才会被置后处理.
实际上这段c代码被编译成汇编就成这样了:
movl $5, 28(%esp)
movl 28(%esp), %eax
imull 28(%esp), %eax
movl %eax, 24(%esp)
addl $1, 28(%esp)
addl $1, 28(%esp)
再成c翻译一下:
a=5:
b=a*a;
a=a+1;
a=a+1;
或许其他编译器会有不同的解释.