まず、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 でも同じだったと思いますか?
ベストアンサー1
データを指定する正しい方法が 2 つあるのはなぜですか
const
。また、状況によっては、どちらか一方を優先したり、必要としたりする場合もありますか。
const
基本的に、アスタリスクの前の within 指定子の位置が重要でない理由は、C 文法が Kernighan と Ritchie によってそのように定義されているためです。
彼らがこのように文法を定義した理由は、おそらく、C コンパイラが入力を左から右に解析し、各トークンを消費するごとに処理を完了するためです。トークンを消費すると、*
現在の宣言の状態がポインター型に変わります。const
の後に遭遇すると*
、修飾子const
がポインター宣言に適用され、 の前に遭遇すると、*
修飾子がポイントされたデータに適用されます。
const
修飾子が型指定子の前にあるか後にあるかによって意味は変わらないため、どちらの方法でも受け入れられます。
関数ポインタを宣言するときにも同様のケースが発生します。
void * function1(void)
を返す関数を宣言しますvoid *
。void (* function2)(void)
宣言する関数ポインタを返す関数にvoid
。
ここでも注目すべき点は、言語構文が左から右へのパーサーをサポートしていることです。