命名空间
变体
操作

替代运算符表示

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
 
 

C++(和 C)源代码可以用任何非 ASCII 的 7 位字符集编写,只要它包含 ISO 646:1983 不变字符集。然而,一些 C++ 运算符和标点符号需要 ISO 646 字符集之外的字符:{, }, [, ], #, \, ^, |, ~。为了能够使用某些或所有这些符号不存在的字符编码(例如德国的 DIN 66003),C++ 定义了以下由 ISO 646 兼容字符组成的替代表示。

目录

[编辑] 替代记号

对于某些使用非 ISO646 字符的运算符和其他记号,存在替代拼写。在语言的所有方面,每个替代记号的行为都与它的主要记号完全相同,除了它的拼写(字符串化运算符可以使拼写可见)。这两个字母的替代记号有时被称为“二合字母”。尽管是四个字母长,%:%: 也被认为是一个二合字母。

主要 备选项
&&
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq
{ <%
} %>
[ <:
] :>
# %:
## %:%:

[编辑] 三字符组 (在 C++17 中移除)

以下三字符组(三字符组)在识别注释和字符串字面量之前被解析,并且每个三字符组的出现都会被相应的原字符替换

主要 三字符组
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

由于三字符组被提前处理,诸如 // Will the next line be executed?????/ 的注释将有效地注释掉下一行,而诸如 "Enter date ??/??/??" 的字符串字面量被解析为 "Enter date \\??"

[编辑] 注意

字符 &! 在 ISO-646 下是不变的,但仍为使用这些字符的记号提供了替代方案,以适应更严格的历史字符集。

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

[编辑] 与 C 的兼容性

在 C 编程语言中,头文件 <iso646.h> 中定义了相同的词语作为宏。由于在 C++ 中这些是内置到语言中的,C++ 版本的 <iso646.h> 以及 <ciso646> 不定义任何内容。然而,非词二合字母(例如 <%)是核心语言的一部分,无需包含任何头文件即可使用(否则,它们将无法在缺少 # 的任何字符集上使用)。

[编辑] 关键词

and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq

[编辑] 示例

以下示例演示了几个替代记号的使用。

%:include <iostream>
 
struct X
<%
    compl X() <%%> // destructor
    X() <%%>
    X(const X bitand) = delete; // copy constructor
    // X(X and) = delete; // move constructor
 
    bool operator not_eq(const X bitand other)
    <%
       return this not_eq bitand other;
    %>
%>;
 
int main(int argc, char* argv<::>) 
<%
    // lambda with reference-capture:
    auto greet = <:bitand:>(const char* name)
    <%
        std::cout << "Hello " << name
                  << " from " << argv<:0:> << '\n';
    %>;
 
    if (argc > 1 and argv<:1:> not_eq nullptr)
        greet(argv<:1:>);
    else
        greet("Anon");
%>

可能的输出

Hello Anon from ./a.out

[编辑] 参考文献

  • C++23 标准 (ISO/IEC 14882:2024)
  • 5.5 替代记号 [lex.digraph]
  • C++20 标准 (ISO/IEC 14882:2020)
  • 5.5 替代记号 [lex.digraph]
  • C++17 标准 (ISO/IEC 14882:2017)
  • 5.5 替代记号 [lex.digraph]
  • C++14 标准 (ISO/IEC 14882:2014)
  • 2.4 三字符序列 [lex.trigraph]
  • 2.6 替代记号 [lex.digraph]
  • C++11 标准 (ISO/IEC 14882:2011)
  • 2.4 三字符序列 [lex.trigraph]
  • 2.6 替代记号 [lex.digraph]
  • C++03 标准 (ISO/IEC 14882:2003)
  • 2.3 三字符序列 [lex.trigraph]
  • 2.5 替代记号 [lex.digraph]
  • C++98 标准 (ISO/IEC 14882:1998)
  • 2.3 三字符序列 [lex.trigraph]
  • 2.5 替代记号 [lex.digraph]

[编辑] 另请参阅

C 文档 关于 替代运算符和记号