web-dev-qa-db-ja.com

矢印演算子とドット演算子

Cの矢印演算子(->)は不要なようです。ドット演算子(。)で十分です。次のコードを取得します。

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

val = foo.member;
val = bar->member;

バーを逆参照するには矢印演算子を使用する必要があることがわかります。しかし、私は書くことを好む

val = bar.member;

構造体から「メンバー」を取得しようとしているか、構造体へのポインタから取得しようとしているかについて、あいまいさはありません。しかし、特にコードをリファクタリングする場合、間違った演算子を使用するのは簡単です。 (たとえば、fooでいくつかの複雑な操作を行っている可能性があるため、コードを新しい関数に移動し、fooにポインターを渡します)。 fooがポインターであるかどうかを気にする必要はないと思います。コンパイラは詳細を心配することができます。

質問:C言語から->を削除する方が簡単ではないでしょうか?

32
remline

「矢印」演算子は構文糖です。 bar->member(*bar).memberと同じです。違いの1つの理由は、保守性です。ドット演算子とは異なる矢印演算子を使用すると、どの変数がポインターで、どの変数がポインターでないかを追跡するのがはるかに簡単になります。常に.を使用し、コンパイラに正しいことを試行させることは可能かもしれませんが、それによって言語が簡単になるとは思いません。 文字通りの代わりにmeantを解釈するようにコンパイラを信頼することは、通常ひどい結果になります。

54
bta

いいえ、それはnot言語から->を削除する方が簡単です。なぜなら、メガトンのコードを書き直す必要があるという単純な理由のためです。ただし、1つのcouldは、pがポインターの場合、p.xp->xと同等であることを定義します。そのコードは現在違法であるため、これは後方互換性のある変更になります。

7
celtschk