2012-07-27 23 views
0

看來,我有一個關於指針誤解,誤解指點一下C++

這裏有一個例子:(代碼可能無法編譯,是不同的PC上)

#include <iostream> 

struct Debris{ 
    long big_data; 
    //code 
}; 

struct Explosion{ 
    Debris *db; 
    //code 
}; 

void test(){ 
    Debris *db = new Debris(); 
    db->big_data = 10000; 

    Explosion *e1 = new Explosion(); 

    e1->db = db; 

    std::cout << "db addr:" << db <<"db value:"<< ++db->big_data <<<="" "explosion's="" db="" addr:"="" e1-="">db << "explosion's db value:" << e1->db->big_data << std::endl; 

    //why db and e1->db have different addresses? 
    //but the e1->db->big_data is changed by ref. 
} 

能否請您解釋一下嗎?提前致謝。

+0

你的問題似乎是不夠精確。你能解釋一下你究竟有什麼麻煩理解嗎? – atomicinf 2012-07-27 16:15:13

+7

爲什麼''''''db',因此改變指針? – 2012-07-27 16:15:58

+0

沒關係,事實證明,這隻會是一個問題,如果你使用後增量運算符,而不是預增量。不過,看起來仍然很奇怪。 – 2012-07-27 16:19:57

回答

-1

事實上,你遞增db說明了這一變化。 ++是運營商中的高優先級。如果您的意圖是在使用該值之前增加big_data,請添加括號。

+0

不,對不起,我的評論是錯誤的。根據[this](http://en.cppreference.com/w/cpp/language/operator_precedence),預增加的優先級低於' - >'。 – 2012-07-27 16:20:36

+0

*皺紋鼻子*你會相信我獨自提出了相同的錯誤答案嗎?啊,那會教我在不刷新頁面的情況下發布。 – 2012-07-30 18:19:46

1

當我解決cout表達,因此編譯,我看到:

db addr:0x1378010 
db value:10001 
explosion's=0x1378010 
explosion's db value:10000 

我假設你問爲什麼值似乎是不同的,你認爲應該在這兩種情況下是相同的。指針是一樣的,正如人們所期望的那樣,因爲沒有改變它們。

這是因爲您既修改和使用同一個表達式中的值,也沒有任何要排序這些操作的值。這給代碼未定義的行爲;你可以看到舊的價值或新的價值,或者可能會發生完全意想不到的事情。

如果你把它分解成兩個語句,那麼第一個將之前的第二測序,你會看到在每種情況下相同的值:

std::cout << "db addr:" << db <<" db value:"<< ++db->big_data; 
std::cout << " explosion's=" << e1->db << " explosion's db value:" << e1->db->big_data << std::endl; 

db addr:0x1720010 
db value:10001 
explosion's=0x1720010 
explosion's db value:10001