2017-07-20 123 views
0

我正在閱讀C++教科書,並且遇到以下練習練習。C++地址和指針

是真是假?解釋:

A. If (x == y) then (&x == &y). 
B. If (x == y) then (*x == *y). 

教科書說A是真的,B是假的,但我相信它應該是相反的?只是因爲x == y並不意味着& x和& y具有相同的地址,我不明白爲什麼B是錯誤的。

+0

x和y應該是什麼類型? –

+2

是的,A是未定義的,但通常是錯誤的。如果在C++中使用x和y指針 – RbMm

+2

,那麼B是true,那麼可以重載運算符:http://en.cppreference.com/w/cpp/language/operators。所以,一般來說,我認爲我們不能從這些條件中說出任何事情。 –

回答

2

A是錯誤的。聲明&x == &y與說0x001F == 0x001E這是錯誤的相同。但是,這是事實。通過*x解引用指針就是比較存儲在這些地址的值。希望這可以幫助。

+0

如果'operator *'與'operator =='相比是不可靠的呢? – tadman

+0

就像一個好奇點一樣,有些方法(語言語義之外)使'x'和'y'別名位於相同的地址。它會使'A'成爲真實的:-) – Serge

1

首先,我解釋了這樣一個問題,即命題必須對錶達式格式良好的任何類型都成立。 A.顯然是錯誤的,因爲兩個對象可以具有相同的值,但不能存儲在相同的地址中。但對所有情況來說都不是錯誤的。例如,當一個是對另一個的引用時。 B.也是虛假的,但不太清楚。如果等號和/或解引用運算符已經被複雜的函數超載,那麼命題不能保證。但是對於基本類型的簡單指針,這個命題是真實的。

因此,如果我們忽略非基本類型的可能性,那麼本書的答案似乎確實被顛倒過來了。考慮到超載,B似乎是正確的,可能是偶然的,而A只是錯誤的。