C 使用';定义';

C 使用';定义';,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+

为什么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+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编程书中的宏章节。它将告诉您,每个宏必须在适当的位置用括号括起来,并向您展示一些不这样做会导致错误的示例。宏绝对不是函数,它们由编译器的不同部分处理,并且过去在编译器运行之前由单独的程序处理。宏将按原样替换。