2

「??」mn VC++ プログラムをコンパイルして実行すると、「^」に変換されます

例えば

sprintf( ch, "??") 

プリントアウト

^

しかし、Turbo C/C++ で同じコードを実行すると、そのような問題はありません。Windows の VC++ で発生するのはなぜですか?

4

3 に答える 3

4

一重引用符ではなく、二重引用符でしたか? それが ??' だった場合は、trigraphに遭遇したことになります。これは、実際には削除する必要がある「機能」ですが、IBM が EBCDIC から UTF-8 に移行していないためではありません。(トリグラフは、C++0x がまだ変更に対して開かれているときに削除が検討されましたが、トリグラフを削除する動きは、IBM と ISO C++ 委員会のその代表者によって激しくブロックされました)。

于 2010-04-15T03:57:05.823 に答える
4

??に対応しますが、単独ではトライグラフではありません。??'^

おそらく、コードにあるものとは異なるものをここに入力したため、文字列の末尾の一重引用符が閉じ引用符に近すぎて見えない可能性があります。

したがって、コードではおそらく次のようになります。

sprintf( ch, "??'");
于 2010-04-15T03:57:43.523 に答える
3

通常、??シーケンスはトライグラフを開始しますが、シーケンス「??」トライグラフではないので、そのように解釈されるべきではありません - おそらくコンパイラにバグがあります - 正確にどのバージョンを使用していて、正確なコードは何ですか (変数宣言を含む)?

このコードは「??」を出力します。ご想像のとおり、MSVC 6 から VS 2010 までのいくつかのバージョンで:

char ch[20];
sprintf( ch, "??");
printf( "%s\n", ch);

ただし、snprintf()行を次のように置き換えます。

sprintf( ch, "'??'");

出力は " '^" になります (VS 2010 を除く)。

簡単なテストでは、VS 2010 がデフォルトでトライグラフのサポートを無効にしていることを示しています ( '??'2 番目のテストで " " が表示されます)。VS 2010 では、/Zc:trigraphsオプションを使用してトライグラフ サポートを明示的に有効にする必要があります。良い。

Trigraph の詳細については、C++ での Trigraph シーケンスの目的は? を参照してください。

于 2010-04-15T03:55:32.383 に答える