当定义与运算符有价值时,#define 如何在编程中工作

How #define works in Programming when define has value with operator?

本文关键字:编程 工作 #define 定义 运算符 有价值      更新时间:2023-10-16

我在理解 #define 如何工作方面遇到了问题。

#include<stdio.h>
#define x 6+3
int main(){
int i;
i=x;    //9
printf("%dn",i);
i=x*x;  //27
printf("%dn",i);
i=x*x*x;   //45
printf("%dn",i);
i=x*x*x*x;    //63
printf("%dn",i);
return 0;
}

如果我使用 #define x 6+3则输出为 9 27 45 63

如果我使用 #define x (6+3)则输出为 9 81 729 6561

#define只是将字符标记(在您的情况下x)替换为您定义的内容。所以在预处理器完成他的工作后,你的示例看起来像这样:

#include<stdio.h>
#define x 6+3
int main(){
    int i;
    i=6+3;    //9
    printf("%dn",i);
    i=6+3*6+3;  //27
    printf("%dn",i);
    i=6+3*6+3*6+3;   //45
    printf("%dn",i);
    i=6+3*6+3*6+3*6+3;    //63
    printf("%dn",i);
    return 0;
}

如果你看一下它,你就会明白为什么例如第二个例子是 27 而不是 81(* 在 + 之前)。

另一方面,如果你写(6 + 3),它将是9 * 9,这就是你所期望的。

这是运算符优先级的情况。你可以研究一下。我对这个问题的描述如下。

如果您使用

#define x 6+3

然后

x = 6+3= 9
x*x = 6+3 * 6+3 = 6+18+3 = 27 (as * has higher precedence as operator than + ; so 3*6 will be evaluated earlier )

同样,还在继续。

现在,如果您使用

#define x (6+3)

然后

x = (6+3) = 9
x*x = (6+3)*(6+3) = 9*9 = 81

同样,还在继续。

所以我的建议是始终使用括号以获得更好的可读性和理解性。

宏的名称被内容替换。这意味着

#define x 6+3
x*x*x*x = 6+3*6+3*6+3*6+3 = 6+18+18+18+3
当您将 x 定义为 (6+3)

- (6+3) 插入时。这意味着

#define x (6+3)
x*x*x*x = (6+3)*(6+3)*(6+3)*(6+3) = 9*9*9*9

阅读有关 C 预处理器和宏的信息

宏扩展是文本替换。 所以

 #define x 6 + 3
 #define y (6+3)

给出以下内容

 printf( "%d %dn", x , y );        // 6 +3 , (6+3) is 9 and 9
 printf( "%d %dn", x *x , y * y ); //  6 + 3 * 6 + 3,  (6+3) * (6+3)
                                    //  6 + 18 + 3   ,  9     *  9
                                    //       27      ,  81