请考虑以下代码段:
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
为什么i
的值不会通过指针改变?
我知道丢弃一个显式声明为const的变量的常量,并修改它的值为'Undefined Behavior'。我很想知道:是否有任何编译器优化机制'编译器用值'?替换程序中的变量。 这意味着语句1被编译器解释为:
cout<<"i= "<<3<<endl;
即使声明
ptr=const_cast<int*>(&i);
替换为
ptr=(int*)(&i);
我得到的输出相同:http://ideone.com/5lzJA
答案 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告诉编译器可以修改标识符(如果没有通过此代码,则由其他人修改,所以不要执行任何优化)