0

ポインタについて誤解しているようです。

ここに例があります:(コードはコンパイルされないかもしれません、別の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.
}

これを説明してもらえますか?前もって感謝します。

4

2 に答える 2

1

式を修正しcoutてコンパイルすると、次のようになります。

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

値が異なるように見える理由を尋ねていると思いますが、どちらの場合も同じであるべきだと思います。何も変更されていないため、ポインタは同じです。

これは、同じ式で値を変更して使用しているためであり、これらのアクションを順序付けるものは何もありません。これにより、コードの動作が未定義になります。古い値や新しい値が表示されたり、まったく予期しないことが発生したりする可能性があります。

これを 2 つのステートメントに分割すると、最初のステートメントが 2 番目のステートメントの前に並べられ、それぞれの場合で同じ値が表示されます。

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
于 2012-07-27T16:52:59.873 に答える
-1

dbをインクリメントしたという事実が、変更の原因です。++ は演算子の中で優先度が高いです。代わりに、値を使用する前に big_data をインクリメントすることが意図されている場合は、括弧を追加してください。

于 2012-07-27T16:19:53.587 に答える