返回信息流struct S
{
const int a;
S(int v):a(v){}
};
union X
{
const int* b;
int* c;
};
int main(int argc, char* argv[])
{
const int d = 10;
S s(10);
X x;
x.b = &s.a;
cout << s.a << endl;
*x.c = 20;
cout << s.a << endl;
x.b = &d;
cout << d << endl;
*x.c = 20;
cout << d << endl;
return 0;
}
结果是:
10
20
10
10
这是一条镜像帖。来源:北邮人论坛 / cpp / #41625同步于 2010/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
偶然发现的,希望对某些人有用
guitarfeng
2010/7/21镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
关注
【 在 buptljl 的大作中提到: 】
: d的内存已经变为20了,为什么还输出10呢?
: --
: 要学会放弃,以积极的心态面对未来的生活
: ...................
跟自己过不去呀,只不过耍了个伎俩骗过了编译器,运行的时候人家觉得很尴尬,发现x.c指向的对象实际是不能修改的,原来是自己被骗啦,于是恼羞成怒并实施报复,原地弄了个临时变量给x.c去指
你忽悠他,他也忽悠你,谁都不欠谁
【 在 buptljl 的大作中提到: 】
: d的内存已经变为20了,为什么还输出10呢?
: --
: 要学会放弃,以积极的心态面对未来的生活
: ...................
ls正解,你再NB,const值也改不了吧
【 在 tiaotiaoyu 的大作中提到: 】
: 跟自己过不去呀,只不过耍了个伎俩骗过了编译器,运行的时候人家觉得很尴尬,发现x.c指向的对象实际是不能修改的,原来是自己被骗啦,于是恼羞成怒并实施报复,原地弄了个临时变量给x.c去指
: 你忽悠他,他也忽悠你,谁都不欠谁
: --
: ...................
学习了
标准明确规定了对union这么个用法,造成的结果是未定义的不确定性行为,也就是编译器不保证有正确的结果
我们只能从结果去推测编译器到底干了些什么,而不能事先预知会出现什么情况
换一个编译器,或许你看到的是两种情况const变量都保持值不变,或许两者都被改变了