-3

以下几行的结果应该是什么?

const int ci=10;
int * ip=(int *)&ci;
(*ip)=90;

我们有两条规则,常量不能被改变,直接使用 * 操作符改变部分内存必须改变那部分内存的内容。但是当我尝试打印这些变量时,我遇到了这样的事情:

cout<<ci<<' '<<(*ip)<<endl;
// output: 10 90

我们该如何解释呢?

4

2 回答 2

4

哦,这只是编译器使用的一种名为常量折叠的优化技术。

因为,你告诉编译器 ci 是一个常量 int,所以它信任你并在编译你的代码时用 10 替换所有 ci 的引用,所以如果你cout<<ci,你会得到一个 10 显示,这不是因为ci 占用的内存不会改变,只是因为编译器在使用 ci 的地方将 ci 替换为 10!

但是,你通过一种不礼貌的方式改变内存,编译器并没有意识到这一点!

所以,“constant”关键字不是严格的约束,只是程序员和编译器之间的约定

于 2013-06-11T07:36:01.477 回答
1

没有什么“应该”是结果。

任何“可能”都是结果。

未定义的行为未定义是有原因的。编译器可能会以意想不到的方式处理常量变量。许多编译器可能会在堆栈上创建变量,让您更改它们。其他人可能会使用写时复制机制进行优化。

你可能会得到相同的数字,你可能会得到不同的数字,你可能会得到一个段错误,你可能会修改与其他 const 变量共享的读写数据,因为它不会改变。未定义就是未定义。解释它是愚蠢的差事。

于 2013-06-11T07:32:12.700 回答