输出C程序

kar*_*421 3 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;
}
Run Code Online (Sandbox Code Playgroud)

(我正在学习C并且相对较新.)

Pre*_*eti 6

#define max 10+2
Run Code Online (Sandbox Code Playgroud)

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

这是愚蠢的.

它只是取代了文字.

max*max
Run Code Online (Sandbox Code Playgroud)

将解决

10+2*10+2
Run Code Online (Sandbox Code Playgroud)

是的

10+(2*10)+2
Run Code Online (Sandbox Code Playgroud)

因为运算符优先,这是

10 + 20 + 2
Run Code Online (Sandbox Code Playgroud)

32

此外,你应该避免预处理宏时,你可以和使用static const代替.您可能也可能不想也考虑使用const变量或enum代替a #define; 每个都有他们的权衡,参考类似的问题:"静态const"vs"#define"vs"enum".

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

#define max (10+2)
Run Code Online (Sandbox Code Playgroud)

由于带括号的代码将使运算符优先.

  • 最后一行是不好的建议.在C中,`static const`变量比每个单向的预处理器宏更差(作为常量).通过向宏添加正确的括号可以轻松解决问题. (4认同)
  • 它并不比每一种宏都差,有很多情况下它比宏更好.也许您想要跟踪所有const数据消耗的内存量.或者您可能希望将所有const保留在特定的ROM段中.static const也是类型安全的,#define:d literals不是,它们总是(signed)int.并且静态const不会不必要地混淆全局命名空间.如果这篇文章中的"max"不会被用作初始化器,我认为最好声明为static const. (2认同)