以下几行应该是什么结果?
const int ci=10;
int * ip=(int *)&ci;
(*ip)=90;
我们有两条规则,常量不能改变,直接用*运算符改变一部分内存必须改变那部分内存的内容。
但是当我尝试打印这些变量时,我会遇到这样的事情:
cout<<ci<<' '<<(*ip)<<endl;
// output: 10 90
我们怎么解释这个?
答案 0 :(得分:4)
哦,这只是编译器使用的名为常量折叠的优化技术。
因为,你告诉编译器ci是一个常量int,所以,它会信任你并在编译你的代码时用c替换ci的所有引用,所以如果你cout<<ci
,你会得到一个10显示,这不是因为ci占用的内存没有变化,只是因为编译器在使用ci的地方用10替换ci!
但是,你通过不礼貌的方式改变记忆,编译器没有意识到这一点!
因此,“constant”关键字不是严格约束,而只是程序员和编译器之间的契约
答案 1 :(得分:1)
结果没有“应该”。
任何“可能”都是结果。
由于某种原因未定义未定义的行为。编译器可能以意外的方式处理常量变量。许多编译器可以在堆栈上创建变量,让您更改它们。其他人可以使用Copy-on-Write机制进行优化。
你可能会得到相同的数字,你可能得到不同的数字,你可能会得到一个段错误,你可能会修改与其他const变量共享的读写数据,因为它不会发生变化。未定义未定义。解释它是一个愚蠢的错误。