有谁能告诉我正确的答案评估程序(内部工作)?
#include<stdio.h>
main()
{
int a=10;
printf("%d %d %d\n",a,a++,++a);
return 0;
}
答案 0 :(得分:0)
此代码没有单一,正确的行为。
从技术上讲,此计划的任何输出或结果都是正确的,即使是 nasal demons 。
属于 undefined behavior 。
虽然我们可以猜测可能的和可能的结果,但在这种情况下C语言允许任何内容。
答案 1 :(得分: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 表达式可以按序列点分成几部分。有关序列点的更多信息,请参阅this answer。