命名空间
变体
操作

替代运算符和标记

来自 cppreference.com
< 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++ 文档替代运算符表示