C 使用';定义';
为什么b是1C 使用';定义';,c,C,为什么b是1 #define P1(x) x+x #define P2(x) 2*P1(x) int a=P1(1)?1:0; int b=P2(a)&a; 我试着简单地输入1,对我来说,它似乎返回b=0,是否有#define的规则?它们在c语言中不是“充当”函数吗?宏仅仅是文本替换。展开代码后,您将得到以下结果: int a=1+1?1:0; int b=2*a+a&a; 请注意,完全没有括号,这是由于宏缺少适当的括号造成的 1+1是非零值,因此a将为1 b因此将是2*1+
#define P1(x) x+x
#define P2(x) 2*P1(x)
int a=P1(1)?1:0;
int b=P2(a)&a;
我试着简单地输入1,对我来说,它似乎返回b=0,是否有#define的规则?它们在c语言中不是“充当”函数吗?宏仅仅是文本替换。展开代码后,您将得到以下结果:
int a=1+1?1:0;
int b=2*a+a&a;
请注意,完全没有括号,这是由于宏缺少适当的括号造成的
1+1
是非零值,因此a
将为1
b
因此将是2*1+1&1
。遵循C中的运算符优先级规则,*
在表达式中具有最高优先级,然后是+
,然后是&
,然后是优先级最低的=
因此表达式等价于:b=((2*1)+1)&1)代码>
2*1==2
,2+1==3
,3&1==1
#define P1(x) x+x
#define P2(x) 2*P1(x)
int a=P1(1)?1:0;
int b=P2(a)&a;
代码替换后,它将如下所示:
int a=1+1?1:0;
int b=2*a+a&a;
由于1+1
不是false
,a
将是1
,因此:
int b=2*1+1&1
为了清楚起见,我将用括号写它(参见):
这相当于:
int b=3&1
int b=0b0011 & 0b0001
int b=0b0001
这相当于:
int b=3&1
int b=0b0011 & 0b0001
int b=0b0001
这相当于:
int b=3&1
int b=0b0011 & 0b0001
int b=0b0001
这意味着b=1
对我来说似乎是个问题。假设您在P2
宏中指的是P1
(大写p
),那么它将扩展为2*x+x
,这是由于运算符优先级相当于(2*x)+x
,这可能并不总是您想要的。这只是宏可能出现的一个“问题”。至于你的问题,你能详细说明一下吗?你没有得到你期望的结果吗?“规则”这个词是什么意思?“经验法则”?“C规范中的规则”?还有其他规则吗?或者仅仅是一般的指导原则?检查一下初级C编程书中的宏章节。它将告诉您,每个宏必须在适当的位置用括号括起来,并向您展示一些不这样做会导致错误的示例。宏绝对不是函数,它们由编译器的不同部分处理,并且过去在编译器运行之前由单独的程序处理。宏将按原样替换。