代替演算子およびトークン
C のソースコードは、ISO 646:1983 の共通文字集合を含む任意の8ビット文字集合 (ASCII でなくても) で書くことができます。 しかし、いくつかの C の演算子および記号は ISO 646 符号化集合の範囲外の文字 ({, }, [, ], #, \, ^, |, ~
) を必要とします。 これらの記号の一部または全部が存在しない文字エンコーディング (ドイツ語の DIN 66003 など) を使用可能とするために、2つの方法があります。 これらの文字を使用する演算子の代替表現と、単一の非 ISO 646 文字であるかのように解釈される2個または3個の ISO 646 互換文字の特別な組み合わせです。
目次 |
[編集] 演算子マクロ(C95)
非 ISO 646 文字を使用する演算子のための代替表現が <iso646.h>
でマクロとして定義されています。
ヘッダ
<iso646.h> で定義 | |
主表現 | 代替表現 |
&& |
and (演算子マクロ) |
&= |
and_eq (演算子マクロ) |
& |
bitand (演算子マクロ) |
| |
bitor (演算子マクロ) |
~ |
compl (演算子マクロ) |
! |
not (演算子マクロ) |
!= |
not_eq (演算子マクロ) |
|| |
or (演算子マクロ) |
|= |
or_eq (演算子マクロ) |
^ |
xor (演算子マクロ) |
^= |
xor_eq (演算子マクロ) |
文字 & および ! は ISO 646 の共通部分ですが、さらに制限の厳しい歴史的な文字集合に適合するために、これらの文字を使用する演算子に対しても代替表現が提供されます。
文字 = はサポートされているすべての文字集合に存在していたため、等しい演算子 == のための代替表現 (eq みたいな) はありません。
[編集] 代替トークン(C95)
以下の代替トークンはコア言語の一部であり、各代替トークンは、言語のあらゆる点において、その綴りを除き、その主トークンとまったく同じ動作をします (文字列化演算子はその綴りを可視化できます)。 2文字の代替トークンは「ダイグラフ」と呼ばれることもあります。
主トークン | 代替トークン |
---|---|
{ |
<%
|
} |
%>
|
[ |
<:
|
] |
:>
|
# |
%:
|
## |
%:%:
|
[編集] トライグラフ
以下の3文字のグループ (トライグラフ) はコメントおよび文字列リテラルが認識される前に解析され、各トライグラフの出現は対応する主文字で置き換えられます。
主文字 | トライグラフ |
---|---|
{ |
??<
|
} |
??>
|
[ |
??(
|
] |
??)
|
# |
??=
|
\ |
??/
|
^ |
??'
|
| |
??!
|
~ |
??-
|
トライグラフは早期に処理されるため、 // Will the next line be executed?????/ のようなコメントは実質的に後続の行をコメントアウトし、 "What's going on??!" のような文字列リテラルは "What's going on|" として解析されます。
[編集] 例
以下の例は <iso646.h>
ヘッダの演算子の代替表現およびダイグラフ、トライグラフの使用方法をデモンストレーションします。
最初のコマンドライン引数 argv[1] 内の空白文字は二重引用符を必要とします (例: ", World!")。
%:include <stdlib.h> %:include <stdio.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:>); %> return EXIT_SUCCESS; ??>
出力例:
Hello, World!
[編集] 関連項目
演算子の代替表現 の C++リファレンス
|