4

投稿矢印演算子 `->` の代わりに何が使えますか? Cステート でのアロー演算子 (->) の使用法

次の 2 つの式は同等です。

x->y
(*x).y

しかし、これは、数学的に同等であると見なされた場合、常に真であるとは限りません。

置換時に g++ がエラーをスローするのはなぜですか?

a->b->c

a->(*b).c

?

上記の同等性は常に置き換え可能ではないようです。したがって、「同等」という用語は少し誤解を招くと思います。

また、この質問では、いかなる種類のオーバーロードについても言及していません。

4

4 に答える 4

16

You've got the associativity rules wrong. a->b->c is (a->b)->c, not a->(b->c), so it becomes (*(a->b)).c (and then (*((*a).b)).c).

于 2012-07-16T19:33:07.650 に答える
8

Because you're not replacing the operators correctly. It should be:

(*(a->b)).c

You're treating your expression as a->(b->c) when you should be treating it as (a->b)->c

于 2012-07-16T19:33:20.653 に答える
2

交換が正しく行われていません。

a->b->cと同等(*(a->b)).cです。

a->(*b).cいくつかの理由で意味がありません。b参照解除できるポインターではありません(ポインターはa->b)。さらに、たとえそうであったとしても、のフィールドのコンテキストで逆参照ポインタを使用することはa意味がありません。

于 2012-07-16T19:36:36.627 に答える
1

表示されている問題は、さまざまな演算子の優先順位の問題です。使用する必要があります: (*(x->y)).z(2 番目のオペランド->(x->y)andzです)。しかし、それは以前にすでに答えられています。

ただし、同等性はpointersにのみ当てはまり、オーバーロードされたときの両方の演算子のプロパティは完全に異なることに注意することが重要です。はoperator->、単一の操作を表すのではなくoperator->、オーバーロードされた演算子が生のポインターを生成するまでの複数のアプリケーションを表すことができるという意味で、言語で非常に奇妙なセマンティクスを持っています。プラス アクセス (つまり、この最後のアプリケーションのみ、a->bと同等(*a)->bです。)

于 2012-07-16T19:51:02.950 に答える