Const データ: 2 つの宣言されたパス
C では、 const を使用してオブジェクトのデータまたはポインターを変更不可能にすることができます。このための従来の構文は次のとおりです:
const T *obj; // Pointer to const data T const *obj; // Equivalent to const T*
ただし、別の構文があることに気づいたかもしれません:
Object const *obj;
これにより、なぜ両方の構文が有効なのか、いつ使用する必要があるのかという疑問が生じます。一方を他方よりも使用しますか?
Const の誕生Data
型宣言内での const の位置付けは、C の初期に由来しています。カーニハンとリッチーによって定義された言語文法では、const データを次のように宣言できました。
const T *obj;
本質的に、C コンパイラはトークンを左から右に解析し、トークンに基づいて適切な型仕様に const を適用します。 Position.
Const 修飾子の適用
const は常にその左側の宣言に適用されるため、型宣言内の const の位置は結果に影響しません。ポインターの場合:
意味上の等価性
この等価性の根本的な理由は、宣言の意味論的な意味が const の位置に関係なく同じままであることです。 const T *obj と T const *obj のどちらを使用しても、obj が指すデータを変更から保護します。
関数ポインター: 類似のケース
類似のケース関数ポインタを宣言するときに状況が発生します:
void * function1(void); // Function returning void * void (* function2)(void); // Function pointer to a function returning void
やはり、左から右への解析
優先例と使用例
最終的に、ある構文を別の構文より優先するかどうかは主観的です。ただし、一般的には、
好みに関係なく、両方の構文が有効であり、セマンティクスの一貫性が保たれます。
以上が`const T *obj` と `T const *obj` が C で両方とも有効なのはなぜですか? それぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。