53

C の矢印演算子 (->) は不要のように思えます。ドット演算子 (.) で十分です。次のコードを使用します。

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

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

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

val = bar.member;

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

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

4

2 に答える 2

86

「矢印」演算子はシンタックス シュガーです。 bar->memberと同じ(*bar).memberです。違いの理由の 1 つは保守性です。ドット演算子とは異なる矢印演算子を使用すると、どの変数がポインターで、どの変数がポインターでないかを追跡するのがはるかに簡単になります。.常に使用して、コンパイラーに正しいことをさせようとすることは可能かもしれませんが、それが言語をより単純にするかどうかは疑問です。文字通り書いたものではなく、意図したものをコンパイラが解釈することを信頼すると、通常、悪い結果になります。

于 2012-04-05T21:43:14.757 に答える
8

いいえ、言語から削除するのは簡単ではありませ->ん。何メガトンものコードを書き直さなければならないという単純な理由からです。ただし、これはifがポインタと同等であると定義できます。そのコードは現在違法であるため、下位互換性のある変更になります。p.xp->xp

于 2012-04-05T21:41:09.073 に答える