5

次の行を非常に簡単な方法で書くと、奇妙な出力が見つかりました。

コード:

 printf("LOL??!\n");
 printf("LOL!!?\n");

出力: 代替テキスト

コードがMBCSとUNICODEの両方でコンパイルされている場合でも発生します。

出力は「?」のシーケンスによって異なります。と "!"...

何か案が?

4

5 に答える 5

16

??!は。に置き換えられるトリグラフ|です。

原則として、ソースファイルのどこにも2つの疑問符文字を一緒に配置しないでください。

于 2010-10-05T10:07:35.950 に答える
5

それらはトリグラフシーケンスと呼ばれます

??!垂直バーのトリグラフシーケンスです|

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: |");
于 2010-10-05T10:08:33.987 に答える
5

あなたは試すことができます

printf( "What?\?!\n" );

コンピュータプログラミングでは、ダイグラフとトライグラフはそれぞれ2文字と3文字のシーケンスであり、プログラミング言語によって1文字として解釈されます。

一部のコンパイラは、トリグラフの認識をオフにするオプション、またはデフォルトでトリグラフを無効にし、それらをオンにするオプションを必要とするオプションをサポートしています。ソースファイルでトリグラフに遭遇したときに警告を発行できるものもあります。Borlandは、トリグラフ処理が必要な場合にのみ使用される別のプログラム、トリグラフプリプロセッサを提供しました。

于 2010-10-06T05:28:45.913 に答える
4

??!トリグラフと呼ばれ、|に置き換えられます 出力で。このリンクを確認してください

于 2010-10-05T10:10:09.727 に答える
2

これは、特別な意味を持つ文字列定数内の文字の特別なシーケンスです。すべての端末が一部の文字をサポートしているわけではないため、元々実装されていたトリグラフと呼ばれます。

于 2010-10-05T10:11:12.577 に答える