我写了以下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并且相对较新。)
答案 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。 其余的应该是明确的。
你应该在需要的时候控制你的算术。