替代運算子表示法
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 文件 關於 替代運算子與記號
|