C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C如何保持const值?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Two different values at the same memory address                                    6个

#include <iostream>
using namespace std;
int main() {
    const int a = 10;
    auto *b = const_cast<int *>(&a);
    *b = 20;
    cout << a << " " << *b;
    cout << endl << &a << " " << b;
}

输出如下:

10 20
0x7ffeeb1d396c 0x7ffeeb1d396c

a和* b位于同一地址,为什么它们具有不同的值?

解决方法

很可能这是由优化引起的.

正如molbdnilo在他的评论中已经说过:“编制者盲目地信任你.如果你骗他们,可能会发生奇怪的事情.”

因此,当启用优化时,编译器会找到声明

const int a = 10;

并且认为“啊,这永远不会改变,所以我们不需要一个”真正的“变量,并且可以用10”替换代码中a的所有外观.此行为称为constant folding.

现在在下一行你“欺骗”编译器:

auto *b = const_cast<int *>(&a);
*b = 20;

并改变了,然你已经答应不这样做.
结果是混乱.

就像很多人已经提到的那样,Christian Hackl在他出色的深入答案中进行了彻底的分析,这是不确定的行为.通常允许编译器对常量应用常量折叠,常量显式声明为const.

你的问题是一个很好的例子(@R_169_6618@会有人投票!)为什么const_cast非常危险(当与原始指针组合时更是如此),应该只在绝对必要的情况下使用,并且应该至少彻底评论了为什么它被使用,如果它是不可避免的.在这种情况下,评论很重要,因为它不仅是你“欺骗”的编译器:

您的同事也将依赖于信息const并依赖于它不会改变的信息.如果它然改变了,你没有通知他们,也没有发表评论,也不知道你在做什么,你将在工作中度过糟糕的一天:)

尝试一下:也许你的程序在调试版本(未优化)和发布版本(优化)中甚至会表现不同,而这些错误通常很难修复.

大佬总结

以上是大佬教程为你收集整理的C如何保持const值?全部内容,希望文章能够帮你解决C如何保持const值?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。