2013-08-04 52 views
-2

请解释下面的代码输出:你能解释下面的输出吗?

#include<stdio.h> 
#include<stdlib.h> 

#define SQUARE(x) (x*x*x) 

int main() { 
    int x = 3; 
    int y = SQUARE(++x)/x++; // Undefined behavior even though it doesn't look 
         // like it here 
    printf("%d %d",x,y); 
    return 0; 
} 

输出:7月25日

请解释y的值如何来为25?

+0

你的平方函数必须是(x * x),你定义了一个立方体函数 – Memolition

+4

当你有未定义的行为时,任何输出都是同样有效的,并且没有任何真正的“解释”它。因此,即使/如果你“修复”了你的“SQUARE”宏,使它变成了正方形而不是立方体,你的结果仍然基本没有意义。 –

+1

你说**未定义的行为**在自己的评论中,那么解释是什么? –

回答

0

该宏命名错误,但这只是一个红鲱鱼。这两个语句展开为:

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 -O4cc有什么不同?实际上,引用Internet Jargon文件:

nasal demons是什么意思

对于遇到未定义构造的C编译器的任何意外行为,Usenet组comp.std.c被识别为速记。在1992年初讨论这个小组的时候,经常提到“当编译器遇到[一个给定的未定义的构造]时,让恶魔飞出你的鼻子是合法的”(这意味着编译器可以任意选择任何奇怪的在不违反ANSI C标准的情况下解释代码的方式)。其他人随后提到了“鼻子恶魔”,后来很快成立。原文可在http://groups.google.com/groups?hl=en&selm=10195%40ksr.com网站上获得。

所以,我会在这里更加小心。你想恶魔从你的鼻子里飞出吗?

+0

宏扩展也加了括号,它是'int y =(++ x * ++ x * ++ x)/ x ++;' – user2485710

+0

True。我会编辑。 –

相关问题