命名空间
变体
操作

替代运算符和记号

来自 cppreference.cn
< c‎ | language

C 源代码可以使用任何 8 位字符集编写,包括 ISO 646:1983 不变字符集,甚至是非 ASCII 字符集。然而,一些 C 运算符和标点符号需要 ISO 646 代码集之外的字符:{, }, [, ], #, \, ^, |, ~。为了能够使用某些或所有这些符号不存在的字符编码(例如德语 DIN 66003),有两种可能性:使用这些字符的运算符的替代拼写,或解释为单个非 ISO 646 字符的两个或三个 ISO 646 兼容字符的特殊组合。

目录

[编辑] 运算符宏 (C95)

对于使用非 ISO646 字符的运算符,在 <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!"

%:include <stdio.h>
%:include <stdlib.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:>);
    %>
    else
    <%
       printf("Hello %s??/n", argc? argv??(42??'42??) : __FILE__);
    %>
 
    return EXIT_SUCCESS;
??>

可能的输出

Hello ./a.out

[编辑] 参见

C++ 文档 关于 替代运算符表示