24.1 运算符宏
<iso646.h> 提供了一组“运算符替代记号宏”,可以用单词形式表示某些符号运算符。它们的历史背景主要是为不便输入特定符号的字符集环境提供兼容写法。
1. 对应关系
| 运算符 | 宏 |
|---|---|
&& | and |
&= | and_eq |
& | bitand |
| | bitor |
~ | compl |
! | not |
!= | not_eq |
|| | or |
|= | or_eq |
^ | xor |
^= | xor_eq |
这些宏是预处理层替换,不会改变运算符语义和优先级。
2. 示例
c
#include <iso646.h>
#include <stdio.h>
int main(void) {
int a = 5;
int b = 10;
if (a not_eq b and a < b) {
puts("a < b");
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
输出:
bash
a < b
3. 命名冲突提示
这些名字本质是宏,因此会参与预处理替换。如果项目中把 and、or 之类名称作为普通标识符,就可能与 <iso646.h> 产生冲突。对已有代码库来说,更稳妥的策略通常是统一不引入该头文件,或把使用范围限制在极少数兼容层文件。
4. 与“代用记号”章节的关系
<iso646.h> 的这些名称属于库宏;而代用记号属于词法层记号规则,两者处于不同层次。阅读时可以把它们分别理解为“库提供的替换入口”和“语言词法兼容入口”,避免把来源混为一谈。
5. 预处理层替换的边界
因为这组名称是宏,替换发生在预处理阶段。也就是说,它们不会只在“表达式位置”生效,而是会在记号级参与替换。若你在公共头里引入 <iso646.h>,再把 and、or 这类短名字用于其他宏拼接语境,阅读和排错成本都会明显上升。把包含范围收敛到实现文件通常更安全。