4

帖子我可以使用什么来代替箭头运算符`->`? 和箭头运算符 (->) 在 C 状态下的用法

以下两个表达式是等价的:

x->y
(*x).y

但是,当被视为数学等价时,这似乎并不总是正确的。

为什么g++替换的时候会报错

a->b->c

a->(*b).c

?

似乎上述等价并不总是可以替换的。因此,我认为“等效”一词有点误导。

另外,在这个问题中,我并不是指任何类型的重载。

4

4 回答 4

16

您的关联规则错误。a->b->c(a->b)->c,不是a->(b->c),所以它变成(*(a->b)).c(然后(*((*a).b)).c)。

于 2012-07-16T19:33:07.650 回答
8

因为您没有正确替换运算符。它应该是:

(*(a->b)).c

你把你的表达a->(b->c)当你应该把它当做(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第二个操作数->(x->y)and z)。但这之前已经回答过了。

然而,重要的是要注意,等价仅适用于指针,并且两个运算符在重载时的属性完全不同。语言中的operator->语义非常奇怪,从某种意义上说,它不代表单个操作,而是可以代表多个应用程序,operator->直到重载的运算符产生一个原始指针,此时它将执行一个等效于取消引用的最后一个应用程序加访问(即仅用于最后一个应用程序,a->b相当于(*a)->b。)

于 2012-07-16T19:51:02.950 回答