C++ 即使在通过const_cast更改const变量后,也会获得相同的const变量值

C++ 即使在通过const_cast更改const变量后,也会获得相同的const变量值,c++,C++,考虑以下代码段: int main() { const int i=3; int *ptr; ptr=const_cast<int*>(&i); *ptr=5; cout<<"i= "<<i<<endl; <------------------- statement 1 cout<<"*ptr= "<<*ptr<<endl; <-----

考虑以下代码段:

int main()
{
    const int i=3;
    int *ptr;

    ptr=const_cast<int*>(&i);
    *ptr=5;

    cout<<"i= "<<i<<endl;  <------------------- statement 1
    cout<<"*ptr= "<<*ptr<<endl;  <------------- statement 2

    return 0;
}

为什么不通过指针更改
i
的值

我知道抛弃显式声明为常量的变量的常量,修改其值是“未定义的行为”。我很想知道:是否有编译器优化机制“编译器用值替换程序中的变量”?。 这意味着编译器将语句1解释为:

cout<<"i= "<<3<<endl;

我得到了相同的输出:

很可能是因为它是一个常量int,编译器正在优化它并直接用I的值替换它

是否有任何编译器优化机制要求编译器用值替换程序中的变量

对,;这就是为什么你看不到价值的变化。试图修改
常量
对象的行为未定义,以便进行类似的优化(以及允许将对象放置在不可写入的内存中)。

i
可以存储在内存的受保护区域,以便
ptr
指向。当然,任何事情都可能是这样,这就是为什么它是未定义的——这基本上意味着,如果您试图触发未定义的行为,则不依赖于发生的任何特定行为


据你所知,它可能导致你的电脑心脏骤停或开始发射激光束,但你永远不会知道,因为它是。。。(w a i t f o r i t)未定义;)

这不是一个优化。优化是将一个程序转换为另一个具有相同行为但使用较少资源的程序。您的程序没有任何已定义的行为,因此您不可能对其应用任何产生相同行为的转换。

我遇到了相同的问题,我添加了volatile,现在它正在修改:

#include<iostream>
using namespace std;

int main()
{
  volatile const int a=5;
  int *p = const_cast<int*>(&a);
  *p=6;
  cout<<"a="<<a;
  return 0;
}

volatile告诉编译器标识符可以修改(如果不是由此代码修改,那么由其他人修改,所以不要执行任何优化)

如果您想知道编译器做了什么,只需看看编译器做了什么(即生成的代码)。我认为下行投票很苛刻优化通常被称为“常量传播”。只要观察到的行为是正确的,编译器就可以做它喜欢做的任何事情。行为是未定义的,因此编译器所做的任何事情都是自动正确的。
ptr=const_cast<int*>(&i);    
 ptr=(int*)(&i);
#include<iostream>
using namespace std;

int main()
{
  volatile const int a=5;
  int *p = const_cast<int*>(&a);
  *p=6;
  cout<<"a="<<a;
  return 0;
}
a=6