トライグラフ
C ソース プログラムのソース文字セットは 7 ビットの ASCII 文字セット内に含まれますが、ISO 646-1983 Invariant Code Set のスーパーセットです。 トライグラフ シーケンスでは、ISO (国際標準化機構) の Invariant Code Set のみを使用して C プログラムを記述できます。 トライグラフは、2 つの連続する疑問符で始まる 3 文字のシーケンスで、これがコンパイラにより対応する区切り文字に置き換えられます。 トライグラフは、一部の区切り文字に対応する適切なグラフィック表示がない文字セットを含む C ソース ファイルで使用できます。
次の表は、9 つのトライグラフ シーケンスを示しています。 最初の列の区切り文字がソース ファイルに出現すると、すべて 2 番目の列の対応する文字に置き換えられます。
トライグラフ シーケンス
トライグラフ |
区切り文字 |
---|---|
??= |
# |
??( |
[ |
??/ |
\ |
??) |
] |
??' |
^ |
??< |
{ |
??! |
| |
??> |
} |
??- |
~ |
トライグラフは、常に 1 つのソース文字として処理されます。 トライグラフの変換は、文字列リテラルと文字定数のエスケープ文字を認識する前の、最初の変換フェーズで実行されます。 認識されるのは、上の表に示した 9 つのトライグラフだけです。 他の文字シーケンスは、変換されません。
文字エスケープ シーケンス \? を使用すると、トライグラフに似た文字シーケンスが誤ってトライグラフとして解釈されないようにできます (エスケープ シーケンスについては、「エスケープ シーケンス」を参照してください)。 たとえば、printf ステートメントを使用して文字列 What??! を印刷しようとして、次のようにしたとします。
printf( "What??!\n" );
出力される文字列は What| です。これは、??! がトライグラフ シーケンスであり、 |文字に置き換えらるからです。 この文字列を正しく印刷するには、次のようにステートメントを記述します。
printf( "What?\?!\n" );
この printf ステートメントでは、2 番目の疑問符の前に円記号のエスケープ文字があることで、??! が誤ってトライグラフとして解釈されないようになります。