Pre-Processor C Macro Syntax
我试图理解预处理器语法。它实际上是一行简单的代码,返回"on"或"off"。然而,我完全搞不清楚到底是什么情况?
我理解C的条件陈述如下:
如果条件?退货-更换?X:或Y,无论哪种方式,这行代码如下:
1
| #define ONOFF(a) ((a) ?"ON" :"OFF") |
号
我不明白这里必须满足什么条件?条件A必须是非空的吗?
- "陈述"是指"表达"?这是两件截然不同的事情。
- 就像你可以在你的C++语法中写EDCOX1×0一样,这意味着EDCOX1×1必须是truth.Falsy只能是false、0或NULL(类似于(void*)0)。
- 第一个操作数的类型与第二个和第三个操作数的类型无关。
true和Flase可以更完美地表示为1或0。如我所见,你已经宣布
1
| #define ONOFF(a) ((a) ?"ON" :"OFF") |
你这里的条件是(a),如果a的值不为零,则为istrue;如果a的值为0,则为假。
这意味着在你的程序中,如果你写
1 2 3
| int a=1;
char *str;
str=ONOFF(a); |
。
发生的替换是
1 2 3
| int a=1;
char *str;
str=((a) ?"ON" :"OFF")// here a=1 |
因为这里,a是1和1为真,str取ON的值。如果a为0,那么str将得到OFF的值。
预处理器宏进行文本替换,所以a不是一个变量——它只是一个占位符,当使用宏时,不管括号中的文本是什么。
您可以使用它来检查指针是否不为空,如下所示:
1 2 3 4
| printf("%s
", ONOFF (ptr ));
printf("%s
", ONOFF (ptr != null)); // This is the same |
或者其他你喜欢的情况:
1 2 3 4 5 6 7 8 9 10 11 12
| printf("%s
", ONOFF (a > b ));
printf("%s
", ONOFF (a && b ));
printf("%s
", ONOFF (a == 1 || c == 4));
printf("%s
", ONOFF (somefunction () != 0));
printf("%s
", ONOFF ((a == b && c == d ) || (a == c && b == d ));
printf("%s
", ONOFF (my_bool_value )); |
号
条件是a必须对true进行评估。在C语言中,这意味着a必须是非零的表达式。
如果a是指针类型,NULL是false,其他值是true。
如果a为整数类型,则0为false,其他值为true。
如果a为浮点型,则0为false,其他值为true。
如果a是struct或void类型,则会出现编译错误。
要在此处添加一点上下文,条件运算符to的第一个操作数必须是标量类型。现在,根据C11第6.2.5章,
Arithmetic types and pointer types are collectively called scalar types.
号
所以,对于条件表达式,
- 任何非零值都将被计算为真,而零(0则被计算为假。
- (对于指针)NULL为假,任何非NULL为真。