预处理器 C 宏语法
Pre-Processor C Macro Syntax
我正在尝试理解预处理器语法。 returns "ON" 或 "OFF" 的代码行非常简单。但是,我完全不知道具体情况是什么?
我对C的条件语句理解如下:
? x : y
如果条件? return - 替换? x : or y 这行代码如下:
#define ONOFF(a) ((a) ? "ON" : "OFF")
我不明白这里必须满足什么条件?条件是 a 必须不是 null 吗?
在这里添加一点上下文,条件运算符的第一个操作数必须是标量类型。现在,从第 6.2.5 章开始,C11
,
Arithmetic types and pointer types are collectively called scalar types.
因此,对于条件表达式,
- 任何非零值都被评估为 TRUE,零 (
0
) 被评估为 FALSE。
- (在指针的情况下)a
NULL
为 FALSE,任何非 NULL
为 TRUE。
条件是 a
必须计算为 true
。在 c 中,这意味着 a
必须是一个非零表达式。
如果a
是指针类型,NULL
是false
,任何其他值都是true
。
如果a
是整数类型,0
是false
,任何其他值是true
。
如果a
是浮点类型,0
是false
,任何其他值是true
。
如果 a
是 struct
或 void
类型,您将遇到编译错误。
预处理器宏执行 文本替换,因此 a
不是变量 - 它只是当宏为 [= 时括号中的任何文本的占位符19=]用过.
您可以像这样使用它来检查指针是否为空:
printf("%s\n", ONOFF(ptr));
printf("%s\n", ONOFF(ptr != null)); // This is the same
或您喜欢的任何其他类型的条件:
printf("%s\n", ONOFF(a > b));
printf("%s\n", ONOFF(a && b));
printf("%s\n", ONOFF(a == 1 || c == 4));
printf("%s\n", ONOFF(somefunction() != 0));
printf("%s\n", ONOFF((a == b && c == d) || (a == c && b == d));
printf("%s\n", ONOFF(my_bool_value));
True
和 Flase
可以更完美地呈现为 1
或 0
。如我所见,您已声明
#define ONOFF(a) ((a) ? "ON" : "OFF")
你这里的条件是(a)
,即true
如果a
的值不为零,如果a
为0
则为假
这意味着在你的程序中,如果你写
int a=1;
char *str;
str=ONOFF(a);
发生的替换是
int a=1;
char *str;
str=((a) ? "ON" : "OFF")// here a=1
因为这里 a
是 1
并且
1
为真,str 得到值 ON
。如果 a
为 0,则 str 将获得值 OFF
我正在尝试理解预处理器语法。 returns "ON" 或 "OFF" 的代码行非常简单。但是,我完全不知道具体情况是什么?
我对C的条件语句理解如下:
? x : y
如果条件? return - 替换? x : or y 这行代码如下:
#define ONOFF(a) ((a) ? "ON" : "OFF")
我不明白这里必须满足什么条件?条件是 a 必须不是 null 吗?
在这里添加一点上下文,条件运算符的第一个操作数必须是标量类型。现在,从第 6.2.5 章开始,C11
,
Arithmetic types and pointer types are collectively called scalar types.
因此,对于条件表达式,
- 任何非零值都被评估为 TRUE,零 (
0
) 被评估为 FALSE。 - (在指针的情况下)a
NULL
为 FALSE,任何非NULL
为 TRUE。
条件是 a
必须计算为 true
。在 c 中,这意味着 a
必须是一个非零表达式。
如果a
是指针类型,NULL
是false
,任何其他值都是true
。
如果a
是整数类型,0
是false
,任何其他值是true
。
如果a
是浮点类型,0
是false
,任何其他值是true
。
如果 a
是 struct
或 void
类型,您将遇到编译错误。
预处理器宏执行 文本替换,因此 a
不是变量 - 它只是当宏为 [= 时括号中的任何文本的占位符19=]用过.
您可以像这样使用它来检查指针是否为空:
printf("%s\n", ONOFF(ptr));
printf("%s\n", ONOFF(ptr != null)); // This is the same
或您喜欢的任何其他类型的条件:
printf("%s\n", ONOFF(a > b));
printf("%s\n", ONOFF(a && b));
printf("%s\n", ONOFF(a == 1 || c == 4));
printf("%s\n", ONOFF(somefunction() != 0));
printf("%s\n", ONOFF((a == b && c == d) || (a == c && b == d));
printf("%s\n", ONOFF(my_bool_value));
True
和 Flase
可以更完美地呈现为 1
或 0
。如我所见,您已声明
#define ONOFF(a) ((a) ? "ON" : "OFF")
你这里的条件是(a)
,即true
如果a
的值不为零,如果a
为0
这意味着在你的程序中,如果你写
int a=1;
char *str;
str=ONOFF(a);
发生的替换是
int a=1;
char *str;
str=((a) ? "ON" : "OFF")// here a=1
因为这里 a
是 1
并且
1
为真,str 得到值 ON
。如果 a
为 0,则 str 将获得值 OFF