gpt4 book ai didi

c++ - 如何更改 C++ 中变量的常量性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:13:24 25 4
gpt4 key购买 nike

下面是我的代码

const int i = 10;
cout<<i<<"\n";
int *ip = (int*)&i;
*ip = 20;
cout<<i<<"\n";

我期望输出为 1020
但我得到的输出为 1010

我能够编译程序并且在编译时或运行时没有收到任何错误,但没有得到预期的结果。如果我已经删除了变量的常量性,为什么没有为它分配新值?

如果有人能解释发生了什么以及可以做些什么来达到我的预期结果,我将不胜感激。

最佳答案

How to change the constness of a variable in C++?

你永远不应该改变一个固有的 const 限定变量的常量!
声明 const 限定变量的目的是在初始化后不应修改它。通过尝试更改常量,您违反了与编译器的约定。

如果您需要修改一个变量,只需不要将其声明为const

请注意,C++ 提供了 const_cast 来删除或添加变量的常量性。但是,在移除 constness 时,应该使用它来移除指向某些最初不是常量的引用/指针的 constness。


What is happening?

发生的是未定义行为

您不应该更改 const 限定变量的常量性,如果您通过一些指针 hackery 这样做,您得到的是未定义的行为。

在未定义行为的情况下,标准不强制编译器提供编译时诊断。请注意,如果您使用最高警告级别进行编译,某些编译器可能会警告您。

此外,未定义的行为意味着当您运行程序时,任何事情都可能发生,编译器可能会向您显示任何结果,并且不需要解释。


Why the result?

在这种情况下,由于 i 是常量,编译器可能将 const 变量内联作为其优化的一部分,因此指针 hackery 不会影响 i 的值,因为它已经被编译器内联,它只是将内联值放在代码中遇到 i 的任何地方。

请注意,编译器这样做是因为您与编译器签订了契约(Contract),

这是我的 i,它在我的程序的整个生命周期中永远不会改变。

只要遵守约定,编译器就可以自由应用它想要的任何优化,在这种情况下它也是这样做的。

关于c++ - 如何更改 C++ 中变量的常量性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com