当我总是得到相同的结果时,为什么这种未定义的行为?

tus*_*har 2 c++

我最近在这个网站上遇到了一个关于C++序列点的问题,关于这段代码将输出的内容:

int c=0;
cout << c++ << c;
Run Code Online (Sandbox Code Playgroud)

回答是输出未定义且<<不是序列点,但我仍然想知道为什么它未定义,即使我编译25次,它仍然总是打印01?

T.E*_*.D. 8

"未定义"意味着标准没有指定在那种情况下必须发生的事情,因此根据定义,编译器所做的任何事情都是正确的.如果它总是打印01,那很好.如果每次运行时都打印出不同的数字,那也没关系.如果它导致猴子飞出你的鼻子(如图所示),那也没关系.

您可能不这么认为,但如果发生这种情况,编译器编写者就会陷入困境.

[编辑:在评论中已经指出,炮弹是"鼻子恶魔",而不是"鼻猴".我为任何意外的混乱道歉.我感到骄傲的任何意图混乱,不要为此道歉.:-)]

  • 我相信最初的术语是"鼻子恶魔".http://catb.org/jargon/html/N/nasal-demons.html (2认同)

小智 6

你问:

为什么即使我编译25次它仍然打印01

答案是因为编译器基本上(但不是完全)确定性 - 给定相同的输入,它们将产生相同的输出.在机器代码方面.并且该机器代码也是确定性的,因此始终输出"01".另一个C++编译器虽然可能以类似的确定性方式生成每次都生成"10"的机器代码.


ava*_*kar 5

因为始终打​​印01是您的程序允许的行为之一.