替代運算子與標記
C 原始碼可以使用任何包含 ISO 646:1983 不變字元集的 8 位元字元編碼編寫,即使是非 ASCII 編碼亦可。然而,有幾個 C 語言的運算子與標點符號需要使用 ISO 646 字元集以外的字元:{, }, [, ], #, \, ^, |, ~。為了能在某些或全部這些符號皆不存在的字元編碼環境下(例如德國的 DIN 66003)進行開發,有兩種解決方案:使用這些字元的替代寫法,或是使用兩個或三個 ISO 646 相容字元的特殊組合,這些組合會被視為單一的非 ISO 646 字元來解析。
目錄 |
[編輯] 運算子巨集 (C95)
針對使用非 ISO 646 字元的運算子,有其對應的替代寫法,並定義於 <iso646.h> 標頭檔中作為巨集使用。
| 定義於標頭檔
<iso646.h> | |
| 主要 | 選擇 (Alternative) |
&& |
以及 (運算子巨集) |
&= |
and_eq (運算子巨集) |
& |
bitand (運算子巨集) |
| |
bitor (運算子巨集) |
~ |
compl (運算子巨集) |
! |
not (運算子巨集) |
!= |
not_eq (運算子巨集) |
|| |
or (運算子巨集) |
|= |
or_eq (運算子巨集) |
^ |
xor (運算子巨集) |
^= |
xor_eq (運算子巨集) |
字元 & 與 ! 在 ISO-646 中是不變的,但為了適應更具限制性的歷史字元集,仍為使用這些字元的運算子提供了替代方案。
相等運算子 == 沒有替代拼寫(例如 eq),因為字元 = 存在於所有受支援的字元集中。
[編輯] 替代標記 (C95)
以下替代標記是核心語言的一部分。在語言的所有層面中,除了拼寫方式不同之外,每個替代標記的行為皆與其主要標記完全相同(字串化運算子可以讓其拼寫方式顯現)。雙字元的替代標記有時被稱為「二元符組」(digraphs),儘管 %:%: 長度為四個字元,它也被視為二元符組)。
| 主要 | 選擇 (Alternative) |
|---|---|
{ |
<%
|
} |
%>
|
[ |
<:
|
] |
:>
|
# |
%:
|
## |
%:%:
|
[編輯] 三元符組 (已於 C23 移除)
以下三字元群組(三元符組,trigraphs)會在辨識註解與字串字面值之前進行解析,且每次出現三元符組時,都會被替換為對應的主要字元。
| 主要 | 三元符組 |
|---|---|
{ |
??<
|
} |
??>
|
[ |
??(
|
] |
??)
|
# |
??=
|
\ |
??/
|
^ |
??'
|
| |
??!
|
~ |
??-
|
由於三元符組的處理時間很早,例如 // Will the next line be executed?????/ 這樣的註解實際上會將下一行註解掉,而像 "What's going on??!" 這樣的字串字面值會被解析為 "What's going on|"。
[編輯] 範例
示範來自 <iso646.h> 的替代運算子拼寫,以及二元符組與三元符組的使用。若命令列參數包含空格,則應使用引號包裹,例如 "Third World!"。
可能輸出
Hello ./a.out
[編輯] 參閱
| C++ 文件 關於 替代運算子表示法
|