猿问

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

同一地址的变量如何产生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

除非编译器进行优化,否则这对我来说几乎是不可能的。怎么样 ?


温温酱
浏览 536回答 3
3回答

30秒到达战场

这是未定义的行为,您正在修改const变量,因此您不能期望结果。我们可以通过转到草案C ++标准部分7.1.6.1&nbsp;cv-qualifiers第4段来看到这一点:[...]任何在其生命周期内修改const对象的尝试(3.8)都会导致未定义的行为。甚至提供了一个例子:const&nbsp;int*&nbsp;ciq&nbsp;=&nbsp;new&nbsp;const&nbsp;int&nbsp;(3);&nbsp;//&nbsp;initialized&nbsp;as&nbsp;requiredint*&nbsp;iq&nbsp;=&nbsp;const_cast<int*>(ciq);&nbsp;//&nbsp;cast&nbsp;required*iq&nbsp;=&nbsp;4;&nbsp;//&nbsp;undefined:&nbsp;modifies&nbsp;a&nbsp;const&nbsp;object在部分中未定义行为的标准定义中1.3.24,给出以下可能的行为:[...]允许的未定义行为包括完全忽略不完全结果的情况,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发出诊断消息)。[...]

慕标琳琳

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

森林海

当你对变量const进行限定时,编译器可以假定一些事情并生成代码,这可以正常工作,只要你尊重协议而不是破坏协议。当你破坏它时,你会得到未定义的行为。请注意,const删除后,它按预期工作;&nbsp;这是一个实例。
随时随地看视频慕课网APP
我要回答