C++ C常量指针中的奇怪行为

C++ C常量指针中的奇怪行为,c++,c,pointers,constants,C++,C,Pointers,Constants,下面几行的结果应该是什么 const int ci=10; int * ip=(int *)&ci; (*ip)=90; 我们有两条规则,常数不能更改,而直接使用*运算符更改内存的一部分必须更改该部分内存的内容。 但当我试图打印这些变量时,我会遇到如下情况: cout<<ci<<' '<<(*ip)<<endl; // output: 10 90 cout没有“应该”的结果 任何“可能”的结果 未定义的行为未定义是有原因的。编译器可能会

下面几行的结果应该是什么

const int ci=10;
int * ip=(int *)&ci;
(*ip)=90;
我们有两条规则,常数不能更改,而直接使用*运算符更改内存的一部分必须更改该部分内存的内容。 但当我试图打印这些变量时,我会遇到如下情况:

cout<<ci<<' '<<(*ip)<<endl;
// output: 10 90
cout没有“应该”的结果

任何“可能”的结果

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


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

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


因为,您告诉编译器ci是一个常量int,因此,它信任您,并在编译代码时将ci的所有引用替换为10,因此如果您
coutModifying一个常量对象是未定义的行为。我相信我会找到一个重复的帖子。稍微解释一下jogojapan的评论-不明确的行为意味着任何事情都可能发生,包括你刚才看到的。@Barmar谢谢。我现在也添加了一个C++复制的链接。