如何定义有运算符的值时#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
答
#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,那就是你期望的结果。
答
这是一个运算符优先级的情况。你可以研究一下。我在这个问题上描述如下。
如果使用
#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
答
宏扩展是一个文本替换。所以
#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
要了解,我建议你自己动手完成的宏扩展明白发生了什么。 – user694733
#define通过文本替换工作。 –
从上面的评论,让你开始'i = x * X' - >'i = 6 + 3 * 6 + 3' –