之后const_cast,主函数中的值不会改变。但是当调用外部函数时发生变化,仍然在 main 中打印旧值(const int首先初始化的地方)。
int main() {
const int i = 5;
int* p = const_cast<int*>(&i);
*p = 22;
std::cout<<i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是5,为什么?观察窗口显示的值i = 22:
那么为什么它会打印 5 呢?如果我调用外部函数,输出会有所不同:
void ChangeValue(const int i) {
int* p = const_cast<int*>(&i);
*p = 22;
std::cout<<i; //Here the value changes to 22
}
int main() {
const int i = 5;
ChangeValue(i); //Value changes to 22 in the ChangeValue function
std::cout<<i // It again prints 5.
}
Run Code Online (Sandbox Code Playgroud)
为什么调用函数后值改变了但值没有改变ChangeValue?
我在 Linux 平台上得到相同的输出。有人可以澄清我的困惑吗?
尝试修改常量值会导致未定义的行为,但不要这样做。
至于为什么它不改变,编译器认为它是一个编译时常量,并且可能将其存储在只读段中。也可能是因为编译器知道该值是常量,并且在生成的代码中使用实际值,而不是读取变量。
对于第二个程序,变量i不能存储在只读段中,它像任何其他局部变量一样存储在堆栈中。但是,由于您标记i为常量,尝试修改它仍然是未定义的行为。
程序打印旧值的原因是因为您按值main传递变量,这意味着它被复制到函数中的局部变量中。如果变量在或函数中不是常量,则函数中的值仍然不会改变。iChangeValuemainChangeValueimain
如果将ChangeValue函数更改为通过引用获取其参数,则可能会得到与第一个程序相同的行为。