Namespaces
Variants

Alternative operators and tokens

From cppreference.net

C源代码可以使用任何包含 ISO 646:1983 不变字符集的8位字符集编写,甚至包括非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++ 文档 关于 替代运算符表示法