命名空間
變體
動作

替代運算子表示法

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

C++ (以及 C) 原始碼可以使用任何包含 ISO 646:1983 不變字元集的 7-位元字元集來編寫。然而,部分 C++ 運算子與標點符號需要使用 ISO 646 字元集以外的字元:{, }, [, ], #, \, ^, |, ~。為了能夠在某些或全部這些符號不存在的字元編碼(例如德國的 DIN 66003)中使用,C++ 定義了以下由 ISO 646 相容字元組成的替代表示法。

目錄

[編輯] 替代記號

針對部分運算子與其他使用非 ISO646 字元的記號,存在著替代的拼寫方式。在語言的各個層面上,每個替代記號的行為皆與其主要記號完全相同,僅拼寫方式不同(字串化運算子可以使拼寫方式顯現出來)。兩個字元組成的替代記號有時被稱為「雙元符」(digraphs)。儘管 %:%: 長度為四個字元,它也被視為雙元符。

主要 選擇 (Alternative)
&& 以及
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq
{ <%
} %>
[ <:
] :>
# %:
## %:%:

[編輯] 三元符 (於 C++17 移除)

下列三個字元組成的群組(三元符)會在 辨識註解與字串常值之前進行解析,且每次出現的三元符都會被替換為對應的主要字元。

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

由於三元符在早期被處理,像 // 下一行會被執行嗎?????/ 這樣的註解將會有效地註解掉下一行;而像 "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 文件 關於 替代運算子與記號
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)