Cの矢印演算子(.
)は、問題のポインターによって参照される構造体のメンバーにアクセスするために使用されますが、ドット(->
)演算子は構造体のメンバーにアクセスするために使用されます。
ポインタ自体には、ドット演算子でアクセスできるメンバはありません(実際には仮想メモリ内の場所を表す数値だけなので、メンバはありません)。したがって、ポインタ上で使用されている場合にポインタを自動的に間接参照するようにドット演算子を定義しただけでも、あいまいさはありません(コンパイル時にコンパイラに認識される情報)。
では、どうして言語作成者は、この一見不要な演算子を追加して、物事をより複雑にすることにしたのでしょうか。大きな設計上の決定は何ですか?
歴史的な(良い、すでに報告されている)理由を超えて、演算子の優先順位に関しても少し問題があります。ドット演算子はスター演算子よりも優先順位が高いためです。
(*(*(*a).b).c).d
a->b->c->d
しかし、2番目は明らかに読みやすくなっています。矢印演算子は最高の優先順位を持ち(ドットと同じ)、左から右に関連付けます。これは、構造体へのポインタと構造体へのポインタの両方にドット演算子を使用するよりも明確だと思います。宣言を見なくても式から型がわかるので、別のファイルにある場合もあります。
Cはまた、何もあいまいにしないという点で優れた仕事をします。
確かにドットは両方の意味を表すために過負荷になる可能性がありますが、コンパイラが2つの互換性のない型を混在させないように、矢印はプログラマがポインタを操作していることを認識します。