替用运算符及记号

来自cppreference.com
< c‎ | language

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 下不变,但仍然为这些运算符提供替用写法,以使用这些字符适应更加受限的历史字符集。

没有等于运算符的替用拼写 == ,因为字符 = 已在所有受支持字符集中存在。

替用记号(C95)

下列替用记号是核心语言的一部分,而且在语言的所有方面,每个替用记号表现准确等同于其基本记号,除了其拼写(字符串化运算符可令拼写可见)。双字另种记号有时被称为“双标符”。


基本 替用
{ <%
} %>
[ <:
] :>
# %:
## %:%:

三标符

下列三字符组(三标符)在注释前分析并在字符串字面量中得到辨认,而且每个三标符的出现会被对应的基本字符取代:

基本 三标符
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

因为三标符在早期处理,故如 // Will the next line be executed?????/ 的注释可以有效地注释掉下一行,且如 "What's going on??!" 的字符串字面量被分析成 "What's going on|"

示例

下例演示来自 <iso646.h> 的替用运算符拼写,以及双标符和三标符的使用。 首个命令行参数, argv[1] ,要求用引号标注: ", World!" 。

%:include <stdlib.h>
%:include <stdio.h>
%:include <iso646.h>
 
int main(int argc, char** argv)
??<
    if (argc > 1 and argv<:1:> not_eq NULL)
    <%
       printf("Hello%s\n", argv<:1:>);
    %>
 
    return EXIT_SUCCESS;
??>

可能的输出:

Hello, World!

参阅