すでに述べたよう??!??!
に、基本的には 2 つのトリグラフ(??!
および??!
再び) が一緒にマッシュアップされ、プリプロセッサによって に置換変換されます||
。つまり、論理 ORです。
すべてのトライグラフを含む次の表は、別のトライグラフの組み合わせを明確にするのに役立ちます。
Trigraph Replaces
??( [
??) ]
??< {
??> }
??/ \
??' ^
??= #
??! |
??- ~
出典: C: A リファレンス マニュアル第 5 版
??(??)
したがって、最終的に にマップされるように見えるトライグラフは[]
、??(??)??(??)
に置き換えられ[][]
ます。
トリグラフは前処理中に置換されるため、ばかげたプログラム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 は英語以外の言語に必要な文字数を提供しなかったため、使用頻度の低い文字を必要な文字に置き換えた多くの各国語のバリエーションが作成されました。
(私のものを強調)
したがって、本質的に、一部の必要な文字 (トライグラフが存在する文字) は、特定の国のバリアントで置き換えられました。これは、他のバリアントがまだ持っていた文字で構成されるトライグラフを使用した代替表現につながります。