代用运算符及记号

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

没有等于运算符 == 的代用拼写(如 eq),因为字符 = 在所有受支持字符集中都已存在。

代用记号(C95)

下列代用记号是核心语言的一部分,而且在语言的所有方面,每个代用记号表现严格等同于其首选记号,除了其拼写(字符串化运算符可令拼写可见)。两个字母的代用记号有时被称为“双标符”(虽然 %:%: 由四个字母长,它也被当做是双标符)。


首选 代用
{ <%
} %>
[ <:
] :>
# %:
## %:%:

三标符 (C23 中移除)

下列三字符组(三标符)在辨认注释和字符串字面量之前就被分析,而且每个出现的三标符会被替换为其对应的首选字符:

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

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

示例

演示来自 <iso646.h> 的代用运算符拼写,以及双标符和三标符的使用。 如果命令行实参中包含空格,则应将其包围在引号中:例如 "Third 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:>);
    %>
    else
    <%
       printf("Hello %s??/n", argc? argv??(42??'42??) : __FILE__);
    %>
 
    return EXIT_SUCCESS;
??>

可能的输出:

Hello ./a.out

参阅