#include<stdio.h>
int main()
{
int a=1;
printf("%d%d%d",a,++a,a++);
}
这里为什么输出331而不是122.
我在互联网上发现的原因是辩论从右到左传递。首先是++然后++ a然后a得到评估,然后以相反的顺序打印。这是正确的理由。
答案 0 :(得分:-1)
gcc -S your_source.c解释你的问题
movl $1, -4(%rbp) #, a
movl -4(%rbp), %ecx # a, a.0
addl $1, -4(%rbp) #, a
addl $1, -4(%rbp) #, a
movl -4(%rbp), %edx # a, tmp61
movl -4(%rbp), %eax # a, tmp62
movl %eax, %esi # tmp62,
movl $.LC0, %edi #, offset to "%d%d%d" sttring
movl $0, %eax #,
call printf #
编译器开发人员不能指望有人会试图以这种丑陋的方式使用它
如果你真的需要122:那么改变asm代码如下:
movl $1, -4(%rbp) #, a
movl -4(%rbp), %eax # a, a.0
addl $1, -4(%rbp) #, a
movl -4(%rbp), %edx # a, tmp61
movl -4(%rbp), %ecx # a, tmp62
movl %eax, %esi # tmp62,
movl $.LC0, %edi #,
movl $0, %eax #,
call printf #
addl $1, -4(%rbp) #, a
leave