我们是否可以在不声明新变量的情况下使用C++将const int
转换为int
? 该选项在VS中可用,但它如何用于其他编译器,如Xcode,代码块等?从const int转换为C++中的int
const int a = 5 ;
int (a) ++ ;
我们是否可以在不声明新变量的情况下使用C++将const int
转换为int
? 该选项在VS中可用,但它如何用于其他编译器,如Xcode,代码块等?从const int转换为C++中的int
const int a = 5 ;
int (a) ++ ;
a
是const
。你不能合法地删除常量来改变任何编译器中的变量。你在VS中看到的是它让你创建一个未命名的临时文件并增加这个值。
@John Dibling我忍者编辑我的答案,添加“变异变量”的话可能在你写这个评论时。 –
忍者编辑! HOI-CHA! –
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”不会改变。
*注意:''const_cast'也处理引用,我推荐'const_cast
以任何方式修改'const' *唤起未定义的行为。不要。 –