风子在某神QQ群给了一段代码
int x=1; printf("%d\n", ++x*++x*++x);问输出什么。
考察如下程序
#include<stdio.h> int main() { int x=1; printf("%d\n", ++x*++x*++x); return 0; }
求其输出。
我会这样计算:
x=1
x=x+1
tmp=x
x=x+1
tmp=tmp*x
x=x+1
tmp=tmp*x
输出tmp即24。
GCC
输出为36。
输出编译后汇编源代码(部分)
movl $1, 28(%esp) incl 28(%esp) incl 28(%esp) movl 28(%esp), %eax imull 28(%esp), %eax incl 28(%esp) imull 28(%esp), %eax movl %eax, 4(%esp)
可以看出gcc是这样计算的:
x=1
x=x+1
x=x+1
tmp=x
tmp=tmp*x
x=x+1
tmp=tmp*x
输出tmp即36
也就是语法树从下到上执行, ++x直接修改变量的内存, 然后乘。
试考虑++x+ ++x*++x
VC++
输出为64。
大量实验表明, vc++是如下行为:
x=1
x=x+1
x=x+1
x=x+1
tmp=x
tmp=tmp*x
tmp=tmp*x
输出tmp即为64
也就是先计算所有的++x。
Xcode
输出为24。
网友告诉我是如下计算:
x=1
x=x+1
tmp=x
x=x+1
tmp=tmp*x
x=x+1
tmp=tmp*x
输出tmp即24。
也就是语法树从下到上执行, 把++x的结果保存在一个或多个临时空间里面, 然后乘。
undefined behavior
应该是“输出风子(写出这段代码的人)被打”的结果。