[解決済み] C++におけるTrigraph配列の目的?
質問
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 か何かを使用)。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] mutable' キーワードには、const 関数で変数を変更できるようにする以外の目的があるのでしょうか?
-
[解決済み】std::launderの目的は何ですか?
-
[解決済み】CとC++におけるユニオンの目的
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】システムが指定されたファイルを見つけられませんでした。