似乎我对指针有误解,
这是一个例子:(代码可能无法编译,在不同的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 :(得分: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
答案 1 :(得分:-1)
您增加 db 的事实说明了更改。 ++是运营商中的高优先级。如果您的意图是在使用值之前增加big_data,请添加括号。