次の行を非常に簡単な方法で書くと、奇妙な出力が見つかりました。
コード:
printf("LOL??!\n");
printf("LOL!!?\n");
出力:
コードがMBCSとUNICODEの両方でコンパイルされている場合でも発生します。
出力は「?」のシーケンスによって異なります。と "!"...
何か案が?
??!
は。に置き換えられるトリグラフ|
です。
原則として、ソースファイルのどこにも2つの疑問符文字を一緒に配置しないでください。
それらはトリグラフシーケンスと呼ばれます
??!
垂直バーのトリグラフシーケンスです|
。
C / C ++プリプロセッサはトリグラフを認識し、それらを同等の文字に置き換えます。
したがって、コードがコンパイラーによって認識されるまでに、トリグラフはすでに置き換えられています。
# grepping in the source file:
$ grep printf a.c
printf("foo: ??!");
# grepping the preprocessor output:
$ gcc a.c -trigraphs -E | grep printf | grep foo
printf("foo: |");
あなたは試すことができます
printf( "What?\?!\n" );
コンピュータプログラミングでは、ダイグラフとトライグラフはそれぞれ2文字と3文字のシーケンスであり、プログラミング言語によって1文字として解釈されます。
一部のコンパイラは、トリグラフの認識をオフにするオプション、またはデフォルトでトリグラフを無効にし、それらをオンにするオプションを必要とするオプションをサポートしています。ソースファイルでトリグラフに遭遇したときに警告を発行できるものもあります。Borlandは、トリグラフ処理が必要な場合にのみ使用される別のプログラム、トリグラフプリプロセッサを提供しました。
??!トリグラフと呼ばれ、|に置き換えられます 出力で。このリンクを確認してください
これは、特別な意味を持つ文字列定数内の文字の特別なシーケンスです。すべての端末が一部の文字をサポートしているわけではないため、元々実装されていたトリグラフと呼ばれます。