代用运算符及记号
C 源代码可以用任何包含 ISO 646:1983 不变量字符集的 8 位字符集书写,即使是非 ASCII 字符集亦可。然而,几个 C 运算符和标点处于 ISO 646 代码集之外:{, }, [, ], #, \, ^, |, ~
。为能使用其中不包含这些符号中的一些或全部的字符编码(例如德文 DIN 66003),有两种可能:使用这些字符的代用运算符拼写,或者两或三个 ISO 646 兼容字符的特殊组合,如同单个非 ISO 646 字符般转译它们。
运算符宏(C95)
有使用非 ISO 646 字符的代用拼写,作为宏定义于 <iso646.h>
:
在标头
<iso646.h> 定义 | |
首选 | 代用 |
&& |
and (运算符宏) |
&= |
and_eq (运算符宏) |
& |
bitand (运算符宏) |
| |
bitor (运算符宏) |
~ |
compl (运算符宏) |
! |
not (运算符宏) |
!= |
not_eq (运算符宏) |
|| |
or (运算符宏) |
|= |
or_eq (运算符宏) |
^ |
xor (运算符宏) |
^= |
xor_eq (运算符宏) |
字符 & 及 ! 在 ISO-646 下不变,但仍然为这些运算符提供代用写法,以使这些字符适应更加受限的历史字符集。
没有等于运算符 == 的代用拼写(如 eq),因为字符 = 在所有受支持字符集中都已存在。
代用记号(C95)
下列代用记号是核心语言的一部分,而且在语言的所有方面,每个代用记号表现严格等同于其首选记号,除了其拼写(字符串化运算符可令拼写可见)。两个字母的代用记号有时被称为“双标符”(虽然 %:%: 由四个字母长,它也被当做是双标符)。
首选 | 代用 |
---|---|
{ |
<%
|
} |
%>
|
[ |
<:
|
] |
:>
|
# |
%:
|
## |
%:%:
|
三标符 (C23 中移除)
下列三字符组(三标符)在辨认注释和字符串字面量之前就被分析,而且每个出现的三标符会被替换为其对应的首选字符:
首选 | 三标符 |
---|---|
{ |
??<
|
} |
??>
|
[ |
??(
|
] |
??)
|
# |
??=
|
\ |
??/
|
^ |
??'
|
| |
??!
|
~ |
??-
|
因为三标符在早期处理,故如 // Will the next line be executed?????/ 的注释可以有效地注释掉下一行,且如 "What's going on??!" 的字符串字面量被分析成 "What's going on|" 。
示例
演示来自 <iso646.h>
的代用运算符拼写,以及双标符和三标符的使用。
如果命令行实参中包含空格,则应将其包围在引号中:例如 "Third World!"。
可能的输出:
Hello ./a.out