帖子What can I use instead of the arrow operator, `->`? 和Arrow operator (->) usage in C 状态
以下两个表达式是等效的:
x->y (*x).y
但是,当作为数学等价时,这似乎并不总是正确的。
为什么g ++在替换
时会抛出错误a->b->c
与
a->(*b).c
似乎上述等价不是始终可替换。因此,我认为“等同”一词有点误导。
另外,我不是指这个问题中的任何超载。
答案 0 :(得分:16)
你的关联规则错了。 a->b->c
为(a->b)->c
,而不是a->(b->c)
,因此它变为(*(a->b)).c
(然后是(*((*a).b)).c
)。
答案 1 :(得分:8)
因为您没有正确更换操作符。它应该是:
(*(a->b)).c
当您将表达式视为a->(b->c)
(a->b)->c
答案 2 :(得分:2)
您正在更换错误。
a->b->c
相当于(*(a->b)).c
。
a->(*b).c
没有意义。 b
不是可以取消引用的指针(指针为a->b
)。另外,即使是这样,在a
字段的上下文中使用解除引用的指针也没有意义。
答案 3 :(得分:1)
您遇到的问题是不同运算符的优先级问题,您应该使用:(*(x->y)).z
(第二个->
的操作数为(x->y)
和{{1} })。但这已经得到了回答。
然而,重要的是要注意,等效仅适用于指针,并且两个运算符在重载时的属性完全不同。 z
在语言中有非常奇怪的语义,因为它不代表单个操作,但可以代表operator->
的多个应用程序,直到重载的运算符产生一个原始指针,此时它将执行最后一个等同于dereference plus access的应用程序(即仅针对最后一个应用程序,operator->
等同于a->b
。)