输出C程序

时间:2012-03-26 03:22:12

标签: c c-preprocessor

我写了以下C程序。输出是32.这是为什么?

#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并且相对较新。)

4 个答案:

答案 0 :(得分:6)

#define max 10+2

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

这是愚蠢的。

它只是替换文字。

max*max

将解析为

10+2*10+2

10+(2*10)+2

因为运算符优先级,这是

10 + 20 + 2

即。 32

此外,您应尽可能避免使用预处理器宏并使用static const代替。您可能也可能不想考虑使用const变量或enum而不是#define;每个都有自己的权衡,请参考类似的问题:"static const" vs "#define" vs "enum"

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

#define max (10+2)

由于带括号的代码会使运算符占优势。

答案 1 :(得分:2)

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

i = 10 +2 * 10 + 2;

对于像这样的宏,通常需要添加括号:

#define max (10+2)

所以你的表达式会扩展为:

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

答案 2 :(得分:1)

编译器看到了这个

i = 10 + 2*10 +2 = 32

您应该像这样进行宏定义

#define max (10+2)

答案 3 :(得分:0)

运营商优先权是一件有趣的事情。 PEMDAS = Parenthises,Exponents,Multiply,Divide,Add,Subtract。

这将解决等于10 +(2 * 10)+ 2。 首先是10 * 2,等于20。

现在读取10 + 20 + 2。 其余的应该是明确的。

你应该在需要的时候控制你的算术。