0

谁能告诉我评估答案的正确程序(内部工作)?

#include<stdio.h>
main()
{
int a=10;
printf("%d %d %d\n",a,a++,++a);
return 0;
}
4

2 回答 2

0

在表达式的单个部分1中,不允许(在 C 的定义行为内)修改对象两次或修改对象并单独使用其值。

您的表达式 、printf("%d %d %d\n",a,a++,++a)、 包含aa++++a。这是不允许的,因为a++++a修改a. 这也是不允许的,因为a使用aa++单独修改a.

不要写这样的代码。

当你这样做时,行为是未定义的。编译器可能会以任何顺序评估这三件事,或者它可能会“破坏”并做一些完全不同的事情。你可能得到“12 11 12”,因为编译器生成的代码是这样的:

  • 首先,记录a++将具有 (11) 的值并计算增量值 (12),但将该值保存在临时寄存器中(暂时不要将其写入内存)。
  • 其次,记录++a将具有的值(12,因为a仍然是 11)。
  • 第三,更新 的值a,从临时或从两者++a或两者。
  • 第四,记录有的值a(现在是 12)。
  • 第五,将这些值 12、11 和 12 传递给printf.

但是代码可能做了其他事情。在这种情况下,您只能通过检查生成的汇编代码来判断。您无法从 C 标准所说的内容中分辨出来,因为 C 标准没有说明在这种情况下会发生什么。检查汇编代码只会告诉您在这种情况下会发生什么;当为不同的处理器架构编译相同的 C 源代码、使用不同的编译开关或更改编译器版本时,它可能会有所不同。


1表达式可以按顺序点划分为多个部分。有关序列点的更多信息,请参阅此答案

于 2013-08-12T17:54:57.410 回答
0

此代码没有单一的正确行为。
从技术上讲,这个程序的任何输出或结果都是正确的,甚至是鼻恶魔

它属于未定义的行为

虽然我们可以猜测可能可能的结果,但在这种情况下,C 语言允许任何事情。

于 2013-08-12T17:23:19.943 回答