谁能告诉我评估答案的正确程序(内部工作)?
#include<stdio.h>
main()
{
int a=10;
printf("%d %d %d\n",a,a++,++a);
return 0;
}
在表达式的单个部分1中,不允许(在 C 的定义行为内)修改对象两次或修改对象并单独使用其值。
您的表达式 、printf("%d %d %d\n",a,a++,++a)、 包含a、a++和++a。这是不允许的,因为a++和++a修改a. 这也是不允许的,因为a使用a和a++单独修改a.
不要写这样的代码。
当你这样做时,行为是未定义的。编译器可能会以任何顺序评估这三件事,或者它可能会“破坏”并做一些完全不同的事情。你可能得到“12 11 12”,因为编译器生成的代码是这样的:
a++将具有 (11) 的值并计算增量值 (12),但将该值保存在临时寄存器中(暂时不要将其写入内存)。++a将具有的值(12,因为a仍然是 11)。a,从临时或从两者++a或两者。a(现在是 12)。printf.但是代码可能做了其他事情。在这种情况下,您只能通过检查生成的汇编代码来判断。您无法从 C 标准所说的内容中分辨出来,因为 C 标准没有说明在这种情况下会发生什么。检查汇编代码只会告诉您在这种情况下会发生什么;当为不同的处理器架构编译相同的 C 源代码、使用不同的编译开关或更改编译器版本时,它可能会有所不同。
1表达式可以按顺序点划分为多个部分。有关序列点的更多信息,请参阅此答案。