简单的 C 预处理器替换

Simple C Preprocessor substitution

所以我写了一个简单的程序来尝试对 #define 宏有更基本的了解,我想知道这两个程序之间的区别是什么,是否有使用第三个程序的根本原因程序? :

#include<stdio.h>
#define x 7

int main()
{
    int i;
    i = x * x * x;
    printf("%d", i);
    return 0;
}

这个程序打印出 343 因为 7 * 7 * 7 = 343

#include<stdio.h>
#define x 5+2

int main()
{
    int i;
    i = x * x * x;
    printf("%d", i);
    return 0;
}

这个程序根据操作顺序打印出 27。 编辑 一种强制第二个打印出 343 的方法,我们可以添加括号,这样我们就可以执行以下操作:

#include<stdio.h>
#define x (5+2)

int main()
{
    int i;
    i = x * x * x;
    printf("%d", i);
    return 0;
}

有什么理由用这种方式而不是第一种方式吗?

宏替换原样替换文本

因此 C 编译器看到代码

i = 7 * 7 * 7;       // when #DEFINE x 7

一种情况,另一种情况如下

i = 5+2 * 5+2 * 5+2; // when #DEFINE x 5+2

(由于简单的算术优先级,结果略有不同。)


为了使它们等效,需要添加括号,例如(首选,见评论):

#define x (5+2)

虽然下面会"suffice"这里

i = (x) * (x) * (x);