原文链接:http://freakrobot.blogbus.com/logs/83841989.html
#include
int main(int argc ,char *argv[])
{
int n,j;
j = 3;
n = (++j)+(++j)+(++j);
printf("%d",n);
return 0;
}
输出结果为什么是16?
gcc -g test.c -o test
objdump -S -d test >test.S
反汇编,
int n,j;
j = 3;
8048532: c7 44 24 18 03 00 00 movl $0x3,0x18(%esp) //将3放在栈里面
8048539: 00
n = (++j)+(++j)+(++j);
804853a: 83 44 24 18 01 addl $0x1,0x18(%esp) //将栈里面的3+1=4
804853f: 83 44 24 18 01 addl $0x1,0x18(%esp) //再+1 = 5
8048544: 8b 44 24 18 mov 0x18(%esp),%eax
8048548: 01 c0 add %eax,%eax //将5+5 = 10
804854a: 83 44 24 18 01 addl $0x1,0x18(%esp) //将栈里的5+1 = 6
804854f: 03 44 24 18 add 0x18(%esp),%eax //6+10=16
8048553: 89 44 24 1c mov %eax,0x1c(%esp)
printf("%d",n);
先做前两个++j,++j在做j+j, 然后接着++j。
如果是n = (j++)+(j++)+(j++);
j = 3;
80483cd: c7 44 24 1c 03 00 00 movl $0x3,0x1c(%esp)
80483d4: 00
n = (j++)+(j++)+(j++);
反汇编:
80483d5: 8b 44 24 1c mov 0x1c(%esp),%eax
80483d9: 01 c0 add %eax,%eax
80483db: 03 44 24 1c add 0x1c(%esp),%eax
80483df: 89 44 24 18 mov %eax,0x18(%esp)
80483e3: 83 44 24 1c 01 addl $0x1,0x1c(%esp)
80483e8: 83 44 24 1c 01 addl $0x1,0x1c(%esp)
80483ed: 83 44 24 1c 01 addl $0x1,0x1c(%esp)
printf("%d/n",n);
这个会不会跟编译器相关呢?
这个是c的未定义行为,
相关贴:
http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/