命名空间
变体
操作

替代运算符和标记

来自 cppreference.cn
< c‎ | 语言

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

目录

[编辑] 运算符宏 (C95)

对于使用非 ISO646 字符的运算符,在 <iso646.h> 中定义了替代拼写作为宏。

在头文件 <iso646.h> 中定义
主要 备选项
&&

(运算符宏)
&=
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++ 文档,关于 替代运算符表示