可能重复:
C/C++更改const的值
以下程序:
int main()
{
const int x = 10;
int * p = (int *)&x;
*p = 12;
cout<<x<<endl;
cout<<*p<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出一个输出:
10
12
Run Code Online (Sandbox Code Playgroud)
cast&x对(int*)有什么影响?为什么x的值仍为10?我预计它会是12.
另一个疑问
为什么我们不能把int**说成int const**?相反,此操作有效
void f(int const ** p);
void g(int const * const * p);
int main()
{
int ** p = /*....*/
f(p); //Error
g(p); //OK
}
Run Code Online (Sandbox Code Playgroud)
请通过合适的示例帮助我理解这一点谢谢!
您正在通过修改声明为的变量来调用未定义的行为const.任何结果都是程序的合法输出,尽管有些结果比其他结果更合理.
正如我在评论中指出的那样:
10可能是由于优化; 编译器知道它x是const所以它可以调用:
cout << 10 << endl;
Run Code Online (Sandbox Code Playgroud)
代替:
cout << x << endl;
Run Code Online (Sandbox Code Playgroud)
不太清楚的是编译器是否将第二个输出优化为:
cout << 12 << endl;
Run Code Online (Sandbox Code Playgroud)
您必须查看生成的汇编程序以确定.但由于整个程序正在调用未定义的行为,因此无论它做什么,编译器都是正确的.