[解決済み] Const before or const after?
質問
まず始めに、皆さんは以下のことをご存知でしょう。
const
は、オブジェクトのデータかポインタのどちらか、または両方を変更できないようにするために使用できます。
const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer
しかし、この構文も使うことができます。
Object const *obj; // same as const Object* obj;
問題は、アスタリスクのどちら側に
const
というキーワードがあります。 個人的には
const
その方が左から右への思考で読みやすいと思うからです。
さらに重要なことは、なぜ2つの正しい指定方法があるのかということです。
const
また、どのような場合にどちらを選ぶか、あるいは必要とするか教えてください。
編集する
つまり、私が生まれるずっと前に、コンパイラがどのように物事を解釈すべきかという標準が起草されていたのに、これは恣意的に決定されたように聞こえるのです。 ということは
const
は、キーワードの左側にあるものに適用される(デフォルトで?
"ショートカット"
をパースして宣言が変わるまでは、少なくともキーワードや型式修飾子を他の方法で適用することができます.
これは、C言語でも同様だったと思うのですが?
解決方法は?
<ブロッククオート
の指定に2つの正しい方法があるのはなぜですか?
const
また、どのような場合にどちらを選ぶか、あるいは必要とするか教えてください。
本来なら、その位置が
const
アスタリスクより前の指定子内は重要ではなく、C言語の文法はKernighanとRitchieによってそのように定義されたからです。
このように文法を定義した理由は、Cコンパイラが入力を左から右へ解析し、それを消費することで各トークンの処理を終了させるためと思われる。 そのため
*
トークンは、現在の宣言の状態をポインタ型に変更します。 エンカウンター
const
の後に
*
というのは
const
修飾子はポインタの宣言に適用されます。
*
は、指されたデータに対して適用されることを意味します。
を指定しても、意味的には変わらないので。
const
修飾子が型指定子の前でも後でも、どちらでも受け入れられます。
同じようなケースは、関数ポインタを宣言するときにも起こります。
-
void * function1(void)
を返す関数を宣言しています。void *
,
-
void (* function2)(void)
を宣言しています。 関数ポインタ を返す関数にvoid
.
ここでも注目すべきは、この言語の構文が左から右へのパーサーをサポートしていることです。
関連
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] constexpr` と `const` の相違点
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】"static const" vs "#define" vs "enum"
-
[解決済み】PHP|define() vs. const.
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】C++の余分な資格エラー
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】char * constとconst char *の違いは何ですか?
-
[解決済み】C++のマップのマップをループ処理するにはどうすればいいですか?