すでに述べたように??!??!
、基本的には2つの3 文字表記(??!
そして??!
再び)が結び付けられ、プリプロセッサーによってに置き換えられ||
、つまり論理ORになります。
すべての3文字表記を含む次の表は、別の3文字表記の組み合わせを明確にするのに役立ちます。
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
出典:C:A Reference Manual 5th Edition
したがって、次のよう??(??)
に見える3文字表記は、最終的ににマッピングされ[]
、??(??)??(??)
に置き換えられ[][]
ます。
トリグラフは前処理中に置換さcpp
れるため、愚かなtrigr.c
プログラムを使用して、自分で出力のビューを取得できます。
void main(){ const char *s = "??!??!"; }
そしてそれを処理します:
cpp -trigraphs trigr.c
次のコンソール出力が表示されます
void main(){ const char *s = "||"; }
お気づきのように、オプションを-trigraphs
指定する必要がありますcpp
。そうしないと警告が表示されます。これは、トリグラフが過去のものであり、それらにぶつかる可能性のある人々を混乱させることを除いて、現代の価値がないことを示しています。
トライグラフの導入の背後にある根拠については、ISO / IEC 646の履歴セクションを見るとよくわかります。
ISO / IEC 646およびその前身であるASCII(ANSI X3.4)は、通信業界における文字エンコーディングに関する既存の慣行を大幅に承認しました。
ASCIIは英語以外の言語に必要な数の文字を提供していなかったため、使用頻度の低い文字を必要な文字に置き換える国別のバリエーションがいくつか作成されました。
(強調鉱山)
したがって、本質的に、いくつかの必要な文字(3文字表記が存在する文字)は、特定の国の変形で置き換えられました。これは、他のバリアントがまだ持っていた文字で構成される3文字表記を使用した代替表現につながります。
!ErrorHasOccurred() ??!???! HandleError();
にコンパイルすると思いますか?です??!
???
!
。ポイントを証明しますか?