1. ホーム
  2. c++

[解決済み] C++におけるTrigraph配列の目的?

2022-06-20 12:48:48

質問

C++'03スタンダード2.3/1によると。

他の処理が行われる前に、以下の3文字のシーケンス(「トリグラフ・シーケンス」)の1つの出現は、表1に示される1文字に置き換えられる。

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      | \           | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------

実際のところ、それはつまり、コード printf( "What??!\n" ); というコードは、結果的に What| なぜなら ??! は三文 字列であり、これを | 文字に置き換えられます。

質問ですが、三文字を使う目的は何ですか? 三段論法を使うことによる実用的なメリットはありますか?

UPD : 回答では、ヨーロッパのキーボードにはすべての句読点がないため、米国以外のプログラマは日常的に三文 字を使用しなければならないと書かれていましたか?

UPD2 : Visual Studio 2010では、trigraphのサポートがデフォルトでオフになっています。

どのように解決するのですか?

この質問(密接に関連するダイグラフについて) は答えを持っています。

それは、ISO 646 文字セットが C 構文のすべての文字を持っていないという事実に帰結します。したがって、その文字を扱えないキーボードやディスプレイを持つシステムもあります (ただし、現在ではかなり稀であると想像されます)。

一般的には使う必要はないのですが、まさにあなたが遭遇した問題のために知っておく必要があるのです。 トリグラフは、' ? という文字がエスケープシーケンスを持つ理由です。

'\?'

ということで、例の問題を回避する方法はいくつかあります。

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

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

しかし、2つの'?'文字を入力するときに、三文字を始めるかもしれないことを忘れてはいけません(そしてそれは確かに決して考えていることではありません)。

実際には、三文字と四文字の組み合わせは、日常的にはまったく気にしないものです。 しかし、数年に一度はそれらに関連するバグに遭遇する (そして、その存在を呪いながら一日を過ごすことになる) ので、注意する必要があります。コンパイラーが三段論法や四則演算に遭遇したときに警告 (またはエラー) を出すように設定できればいいのですが、そうすれば、意図的に対処しなければならないものがあることを知ることができます。

文字列リテラル内のダイグラフはダイグラフとして解釈されないので、ダイグラフはトークンとして処理されるので、それほど危険ではありません。

C/C++ プログラムの句読点に関するさまざまな楽しい教育 (私が髪を引っ張ってしまうような三段論法バグを含む) については、以下を参照してください。 Herb Sutter の GOTW #86 の記事 .


追記

GCCはデフォルトでtrigraphを処理しない(そして警告を出す)ようです。 他のいくつかのコンパイラーは、trigraph のサポートをオフにするオプションを持っています (たとえば、IBM のもの)。 Microsoft は VS2008 で警告 (C4837) をサポートし始め、明示的に有効にする必要があります (-Wall か何かを使用)。