2012-03-26 65 views
3

我写了下面的C程序。输出是32.这是为什么?输出一个C程序

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#define max 10+2 

int main(){ 
    int i; 
    i = max * max; 
    printf("\n%d\n",i); 

    return 0; 
} 

(我学习C和是比较新的了。)

+1

如果我告诉你编译器实际看到的是“'i = 10 + 2 * 10 + 2;'”,它有帮助吗? – zwol 2012-03-26 03:24:50

回答

6
#define max 10+2 

这是预处理器。它不聪明。

这是愚蠢的。

它只替换文本。

max*max 

将解析到

10+2*10+2 

10+(2*10)+2 

因为操作者的优先级,这是

10 + 20 + 2 

32

0123的

此外,你应该避免时,你可以并用static const代替预处理宏。您可能会或可能不希望也考虑使用const变量或enum而不是#define;每个人都有他们的权衡,参考类似的问题:"static const" vs "#define" vs "enum"

如果你想坚持到预处理器,那么你可以只使用:

#define max (10+2) 

由于parenthesised代码将采取运营商precendence。

+4

最后一行是不好的建议。在C中,一个'static const'变量比每个单独的预处理器宏更糟(作为常量)。通过向宏添加正确的括号可以轻松解决问题。 – 2012-03-26 03:49:19

+0

@R ..你能解释为什么它更糟。 – 2012-03-26 03:56:50

+0

Bigges之一就是它不是一个常量表达式,所以它不能用于需要常量表达式的上下文中,甚至不能用作其他静态常量对象的初始化方法。 – 2012-03-26 04:41:08

1

编译器看到这个

i = 10 + 2*10 +2 = 32 

你应该做的宏定义这样

#define max (10+2) 
2

由于max是一个宏,因此它会以文本方式进行扩展,因此您的代码将与:

i = 10 +2 * 10 + 2; 

对于这样一个宏,你通常要添加括号:

#define max (10+2) 

所以,你的表达将扩大到:

i = (10+2) * (10+2); 
0

运算符优先级是一件有趣的事情。 PEMDAS = Parenthises,Exponents,Multiply,Divide,Add,Subtract。

这是要解决到等于10 +(2 * 10)+ 2 第一个是10 * 2,等于20。

现在显示的是10 + 20 + 2 其余部分应是明确。

您应该在需要时对您的算术进行控制。

+0

PEMDAS并没有真正在C.应用。例如,'3 << 1 + 2'产生24,而不是8 – 2012-03-26 03:50:49

+0

事实上,忘掉PEMDAS,这对你没有好处的C.拿这个不起眼的,但有效的例子'a * = - ++ b/c;'。减去然后加,然后除,然后相乘。 – Lundin 2012-03-26 11:29:44