命名空間
變體
動作

替代運算子與標記

出自 cppreference.com
< c‎ | 語言

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!"

%:include <stdio.h>
%:include <stdlib.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

[編輯] 參閱

C++ 文件 關於 替代運算子表示法
English Deutsch 日本語 中文(简体) 中文(繁體)