我写了下面的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和是比较新的了。)
我写了下面的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和是比较新的了。)
#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)
由于parenthesised代码将采取运营商precendence。
最后一行是不好的建议。在C中,一个'static const'变量比每个单独的预处理器宏更糟(作为常量)。通过向宏添加正确的括号可以轻松解决问题。 – 2012-03-26 03:49:19
@R ..你能解释为什么它更糟。 – 2012-03-26 03:56:50
Bigges之一就是它不是一个常量表达式,所以它不能用于需要常量表达式的上下文中,甚至不能用作其他静态常量对象的初始化方法。 – 2012-03-26 04:41:08
编译器看到这个
i = 10 + 2*10 +2 = 32
你应该做的宏定义这样
#define max (10+2)
由于max
是一个宏,因此它会以文本方式进行扩展,因此您的代码将与:
i = 10 +2 * 10 + 2;
对于这样一个宏,你通常要添加括号:
#define max (10+2)
所以,你的表达将扩大到:
i = (10+2) * (10+2);
运算符优先级是一件有趣的事情。 PEMDAS = Parenthises,Exponents,Multiply,Divide,Add,Subtract。
这是要解决到等于10 +(2 * 10)+ 2 第一个是10 * 2,等于20。
现在显示的是10 + 20 + 2 其余部分应是明确。
您应该在需要时对您的算术进行控制。
PEMDAS并没有真正在C.应用。例如,'3 << 1 + 2'产生24,而不是8 – 2012-03-26 03:50:49
事实上,忘掉PEMDAS,这对你没有好处的C.拿这个不起眼的,但有效的例子'a * = - ++ b/c;'。减去然后加,然后除,然后相乘。 – Lundin 2012-03-26 11:29:44
如果我告诉你编译器实际看到的是“'i = 10 + 2 * 10 + 2;'”,它有帮助吗? – zwol 2012-03-26 03:24:50