如何定义有运算符的值时#define如何工作?

如何定义有运算符的值时#define如何工作?

问题描述:

我面临的问题是如何理解#define是如何工作的。如何定义有运算符的值时#define如何工作?

#include<stdio.h> 
#define x 6+3 
int main(){ 

int i; 
i=x; //9 
printf("%d\n",i); 
i=x*x; //27 
printf("%d\n",i); 
i=x*x*x; //45 
printf("%d\n",i); 
i=x*x*x*x; //63 
printf("%d\n",i); 

return 0; 
} 

如果我使用#define x 6+3输出是9月27日45 63

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

+7

要了解,我建议你自己动手完成的宏扩展明白发生了什么。 – user694733

+0

#define通过文本替换工作。 –

+0

从上面的评论,让你开始'i = x * X' - >'i = 6 + 3 * 6 + 3' –

#define只是替换字符令牌(在你的情况x)与你定义它是什么。 所以,你的例子是这样的预处理器做了他的工作后:

#include<stdio.h> 
#define x 6+3 
int main(){ 

    int i; 
    i=6+3; //9 
    printf("%d\n",i); 
    i=6+3*6+3; //27 
    printf("%d\n",i); 
    i=6+3*6+3*6+3; //45 
    printf("%d\n",i); 
    i=6+3*6+3*6+3*6+3; //63 
    printf("%d\n",i); 

    return 0; 

} 

如果你看在它你知道为什么例如第二个例子是27而不是81(*之前的+)。另一方面,如果你写(6 + 3)它将是9 * 9,那就是你期望的结果。

+3

”*替换变量*“有点令人误解,因为预处理器不知道*关于”变量“。后一句更好地阅读“替换字符标记”。 – alk

+0

哦,你是对的。谢谢。 – Rafiwui

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

如果使用

#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 Preprocessor and Macros

宏扩展是一个文本替换。所以

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

提供了以下

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