C(gcc)编译器中的递增和递减

时间:2013-08-12 16:31:07

标签: c algorithm increment decrement

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

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

2 个答案:

答案 0 :(得分:0)

此代码没有单一,正确的行为。
从技术上讲,此计划的任何输出或结果都是正确的,即使是 nasal demons

属于 undefined behavior

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

答案 1 :(得分: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 表达式可以按序列点分成几部分。有关序列点的更多信息,请参阅this answer