2013-10-16 270 views
1

我们是否可以在不声明新变量的情况下使用C++将const int转换为int? 该选项在VS中可用,但它如何用于其他编译器,如Xcode,代码块等?从const int转换为C++中的int

const int a = 5 ; 
int (a) ++ ; 
+4

以任何方式修改'const' *唤起未定义的行为。不要。 –

回答

4

aconst。你不能合法地删除常量来改变任何编译器中的变量。你在VS中看到的是它让你创建一个未命名的临时文件并增加这个值。

+0

@John Dibling我忍者编辑我的答案,添加“变异变量”的话可能在你写这个评论时。 –

+1

忍者编辑! HOI-CHA! –

0

TL; DR:您可以更改const变量的值,但不能保证您的代码的行为与您一样。

还有就是,当然是一个办法做到这一点,先让我们确保你理解你问做什么:

const int a = 5; 

这告诉编译器有一个值,5,要称其为“A”,例如,所以你可以这样做:

const int MaxNameLen = 5; 
char name[MaxNameLen + 1]; 

const float pi = 3.14; 
return pi * radius; 

编译时没有选择这可能会产生代码,像任何其他注入变量一样使用它,就像你期望的那样。

但是通过调用变量“const”,您已经与编译器签订了一个合约:按照这个值不会改变。所以你可以这样做,例如:

int a = 5; 
*(static_cast<int*>(&a))++; 

但是就编译器而言,a没有改变。它可以继续像以前那样行事。所以如果它把它加载到一个寄存器中,如果它根据它来确定一些东西的大小,就可以自由地继续前进,并假定它可以在任何看到“a”的地方使用值“5”。例如:

#include <iostream> 
using namespace std; 

int main() 
    { 
    const int a = 5; 
    (*const_cast<int*>(&a))++; 
    std::cout << "a = " << a << std::endl; 
} 

可能打印5或它可能打印6,取决于哪个编译器,哪些设置和代码的上下文。变量“a”有一个地址,但你告诉编译器它不会改变,所以它可能已经把它推到栈上或者把它加载到一个寄存器中。

如果这会损害你,最糟糕的是高度优化,因为编译器将根据你的承诺产生指令和顺序,使得“a”不会改变。

+1

*注意:''const_cast'也处理引用,我推荐'const_cast (a)++'。 –