谁能告诉我评估答案的正确程序(内部工作)?
#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表达式可以按顺序点划分为多个部分。有关序列点的更多信息,请参阅此答案。