即使在通过const_cast更改之后获取const变量的相同值

时间:2012-07-27 15:17:24

标签: 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;  <------------- statement 2

    return 0;
}

我得到的输出为:

i= 3
*ptr= 5

http://ideone.com/Bvme6

为什么i的值不会通过指针改变?

我知道丢弃一个显式声明为const的变量的常量,并修改它的值为'Undefined Behavior'。我很想知道:是否有任何编译器优化机制'编译器用值'?替换程序中的变量。 这意味着语句1被编译器解释为:

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

即使声明

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

替换为

 ptr=(int*)(&i);

我得到的输出相同:http://ideone.com/5lzJA

5 个答案:

答案 0 :(得分:2)

  

是否有编译器优化机制,编译器用值?

替换程序中的变量

是;这就是你没有看到价值变化的原因。尝试修改const对象的行为未定义,以便允许这样的优化(以及允许将对象放置在不可写入的内存中)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

最有可能因为它是一个const int,编译器正在优化并直接用i的值替换它。

答案 3 :(得分:0)

i 可以存储在内存的受保护区域,以便ptr指向。当然,任何情况都是如此,这就是 undefined 的原因 - 这基本上意味着如果您尝试触发未定义的行为,则不依赖于任何特定的行为。

就你所知,它可能会导致你的计算机进入心脏骤停或开始射出激光束,但你永远不会知道因为它......(等_为它)...... 未定义;)。

答案 4 :(得分:0)

我有同样的问题,我添加了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;
}

输出:

a=6

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