为了账号安全,请及时绑定邮箱和手机立即绑定

同一地址的变量如何产生2个不同的值?

同一地址的变量如何产生2个不同的值?

C++
温温酱 2019-08-14 15:57:53
同一地址的变量如何产生2个不同的值?考虑一下:#include <iostream>using namespace std;int main(void){     const int a1 = 40;     const int* b1 = &a1;     char* c1 = (char *)(b1);     *c1 = 'A';     int *t = (int*)c1;     cout << a1 << " " << *t << endl;     cout << &a1 << " " << t << endl;      return 0;}这个输出是:40 65 0xbfacbe8c 0xbfacbe8c除非编译器进行优化,否则这对我来说几乎是不可能的。怎么样 ?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这是未定义的行为,您正在修改const变量,因此您不能期望结果。我们可以通过转到草案C ++标准部分7.1.6.1 cv-qualifiers4段来看到这一点:

[...]任何在其生命周期内修改const对象的尝试(3.8)都会导致未定义的行为。

甚至提供了一个例子:

const int* ciq = new const int (3); // initialized as requiredint* iq = const_cast<int*>(ciq); // cast required*iq = 4; // undefined: modifies a const object

在部分中未定义行为的标准定义中1.3.24,给出以下可能的行为:

[...]允许的未定义行为包括完全忽略不完全结果的情况,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发出诊断消息)。[...]


查看完整回答
反对 回复 2019-08-14
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

您的代码具有未定义的行为,因为您正在修改常量对象。什么都可能发生,没有什么是不可能的。


查看完整回答
反对 回复 2019-08-14
?
森林海

TA贡献2011条经验 获得超2个赞

当你对变量const进行限定时,编译器可以假定一些事情并生成代码,这可以正常工作,只要你尊重协议而不是破坏协议。当你破坏它时,你会得到未定义的行为。

请注意,const删除后,它按预期工作; 这是一个实例


查看完整回答
反对 回复 2019-08-14
  • 3 回答
  • 0 关注
  • 535 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信