2012-07-16 99 views
4

的帖子What can I use instead of the arrow operator, `->`?Arrow operator (->) usage in C 狀態C++箭頭操作符equivelence

下面的兩個表達式是等效的:

x->y 
(*x).y 

但噹噹作這似乎並不總是真的數學等價。

爲什麼用

a->(*b).c 

更換

a->b->c 

何時G ++拋出一個錯誤?

看來上面的等值不是總是可以替換。因此,我認爲「等值」一詞有點誤導。

此外,我不是指在這個問題上的任何重載。

+0

順便說一下,在這方面你錯了(見答案),但一般來說'a-> b'和'(* a).b'不一定等價,因爲' - >'和'*'可以爲你自己的類重載。當'a'是指針類型時,它們* *完全等價,但是(或者當'operator - >'和'operator *'正確超載時)。 – 2012-07-16 19:34:56

+0

Konrad,我的觀點是我們必須小心「完全等效」這個詞。當我讀到這個短語時,它會顯示「第一個的任何實例可以被第二個替換」。看來在這種情況下,等價取決於操作的順序。 – Tommy 2012-07-16 19:49:43

+0

他們*完全等同。但在進行替換時,您仍然需要遵守優先規則。你不能只做文本替換。畢竟,在數學中,「x + x」和「2 * x」是完全等價的(它們對x的所有值都是相等的),但是當你忽略數學規則並用數學表達式「 x + x/2「會得到錯誤的結果(因爲x + x/2≠2 * x/2)。 – 2012-07-16 20:02:03

回答

16

你的關聯性規則錯了。 a->b->c(a->b)->c,而不是a->(b->c),所以它變成(*(a->b)).c(然後(*((*a).b)).c)。

8

因爲您沒有正確地更換操作員。它應該是:

(*(a->b)).c 

你治療你的表達a->(b->c)時,你應該把它當作(a->b)->c

2

你做不正確的更換。

a->b->c相當於(*(a->b)).c

a->(*b).c由於多種原因沒有意義。 b不是可以解引用的指針(指針是a->b)。此外,即使它是,在a的字段上下文中使用解除引用的指針也是沒有意義的。

1

你所看到的問題是與不同運營商的precendence的問題,您應該使用:(*(x->y)).z(到第二->的操作數是(x->y)z)。但之前已經回答了這個問題。

然而,重要的是要注意,只有指針的等價性纔是正確的,並且兩個運算符在重載時的屬性完全不同。 operator->在語言中具有非常奇怪的語義,因爲它不代表單個操作,但可以代表operator->的多個應用程序,直到重載操作符生成一個原始指針,此時它將執行一個等效的最後一個應用程序解除引用和訪問權限(即僅針對最後一個應用程序,a->b相當於(*a)->b。)