c程序中的错误输出 #包括 int main() { INTA=1; printf(“%d%d%d”,a,++a,a++); }
这里为什么是输出331而不是122c程序中的错误输出 #包括 int main() { INTA=1; printf(“%d%d%d”,a,++a,a++); },c,function,calling-convention,C,Function,Calling Convention,这里为什么是输出331而不是122 我在互联网上发现的原因是争论是从右向左传递的。首先对a++进行计算,然后对a++进行计算,然后按相反的顺序打印。这是正确的原因吗。gcc-S你的来源。c解释你的问题 #include<stdio.h> int main() { int a=1; printf("%d%d%d",a,++a,a++); } 编译器开发人员不能期望有人会以如此丑陋的方式使用它 如果您确实需要122:则按如下所示更改asm代码: movl $1, -4(
我在互联网上发现的原因是争论是从右向左传递的。首先对a++进行计算,然后对a++进行计算,然后按相反的顺序打印。这是正确的原因吗。gcc-S你的来源。c解释你的问题
#include<stdio.h>
int main()
{
int a=1;
printf("%d%d%d",a,++a,a++);
}
编译器开发人员不能期望有人会以如此丑陋的方式使用它
如果您确实需要122:则按如下所示更改asm代码:
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 #
不,告诉我原因-未定义的行为@cool guy,但我的书说这与称之为约定有关你的书错了。很抱歉。请阅读作为问题第二个答案发布的链接n.m.链接到:这是这里唯一有效的答案。
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