该宏命名错误,但这只是一个红鲱鱼。这两个语句展开为:
int x = 3;
int y = (++x * ++x * ++x)/x++;
这是未定义的行为,因为x在序列点之间不止一次被修改。编译器可以做任何事情;它可以交叉使用x
以及几乎任何它想要的前后增量x
。它可以做的事情由左到右,在这种情况下,您可以:
int y = (4 * 5 * 6)/6;
在此计划下,x
现在是7和y
现在是20
它可以做正确的事情,以 - 左:现在
int y = (7 * 6 * 5)/3;
,y
是70
它可能是缓存的x
在几乎任何一个点的价值d使用它。尝试在各种编译器下运行您的程序,并提供各种优化级别。 gcc -O4
与cc
有什么不同?实际上,引用Internet Jargon文件:
nasal demons是什么意思
对于遇到未定义构造的C编译器的任何意外行为,Usenet组comp.std.c被识别为速记。在1992年初讨论这个小组的时候,经常提到“当编译器遇到[一个给定的未定义的构造]时,让恶魔飞出你的鼻子是合法的”(这意味着编译器可以任意选择任何奇怪的在不违反ANSI C标准的情况下解释代码的方式)。其他人随后提到了“鼻子恶魔”,后来很快成立。原文可在http://groups.google.com/groups?hl=en&selm=10195%40ksr.com网站上获得。
所以,我会在这里更加小心。你想恶魔从你的鼻子里飞出吗?
你的平方函数必须是(x * x),你定义了一个立方体函数 – Memolition
当你有未定义的行为时,任何输出都是同样有效的,并且没有任何真正的“解释”它。因此,即使/如果你“修复”了你的“SQUARE”宏,使它变成了正方形而不是立方体,你的结果仍然基本没有意义。 –
你说**未定义的行为**在自己的评论中,那么解释是什么? –