加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C如何保持const值?

发布时间:2020-12-16 10:37:45 所属栏目:百科 来源:网络整理
导读:参见英文答案 Two different values at the same memory address????????????????????????????????????6个 #include iostreamusing namespace std;int main() { const int a = 10; auto *b = const_castint *(a); *b = 20; cout a " " *b; cout endl a " " b
参见英文答案 > 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.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读