Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么相同的内存位置同时持有不同的值?_C++ - Fatal编程技术网

C++ 为什么相同的内存位置同时持有不同的值?

C++ 为什么相同的内存位置同时持有不同的值?,c++,C++,在下面的程序中,同一内存位置如何保存不同的值? 我正在使用g++编译器 代码: 你有未定义的行为,所以任何事情都可能发生。在这种情况下,编译器知道i不能更改值,可能只是直接使用值。您有未定义的行为,所以任何事情都可能发生。在这种情况下,编译器知道i不能更改值,可能只是直接使用值。内存不能同时保存不同的值。但是,修改声明为const的对象是未定义的行为,因此任何事情都可能发生 任何事情都包括让它看起来像是同一个内存位置在同一时间持有不同的值。由于i无法更改,因此它是常数折叠的候选对象,因此当i出现

在下面的程序中,同一内存位置如何保存不同的值? 我正在使用g++编译器

代码:


你有未定义的行为,所以任何事情都可能发生。在这种情况下,编译器知道
i
不能更改值,可能只是直接使用值。

您有未定义的行为,所以任何事情都可能发生。在这种情况下,编译器知道
i
不能更改值,可能只是直接使用值。

内存不能同时保存不同的值。但是,修改声明为
const
的对象是未定义的行为,因此任何事情都可能发生


任何事情都包括让它看起来像是同一个内存位置在同一时间持有不同的值。由于
i
无法更改,因此它是常数折叠的候选对象,因此当
i
出现在表达式中时,不会涉及任何内存。

内存不能同时保存不同的值。但是,修改声明为
const
的对象是未定义的行为,因此任何事情都可能发生


任何事情都包括让它看起来像是同一个内存位置在同一时间持有不同的值。由于
i
无法更改,因此它是常数折叠的候选者,因此当
i
出现在表达式中时,不会涉及任何内存。

,当你修改C++时,你会调用C++神的愤怒。编译器更可能优化你使用<代码> i>代码>,并在你的<代码> cOUT>代码>语句中直接使用值<代码> 100代码>。修改常量变量是未定义的行为。另外,@chris所说的:-)您的代码有一个bug,所以它当然不会做您期望它做的事情!修复错误,谜团就会消失。你对编译器撒了谎,所以它对你撒了谎。诚实是最好的策略。嗯,当你修改C++时,你会调用C++众神的愤怒。编译器更可能优化你使用<代码> i>代码>,并在你的<代码> cOUT>代码>语句中直接使用值<代码> 100代码>。修改常量变量是未定义的行为。另外,@chris所说的:-)您的代码有一个bug,所以它当然不会做您期望它做的事情!修复错误,谜团就会消失。你对编译器撒了谎,所以它对你撒了谎。诚实是最好的策略。我不擅长未定义的行为omancy,但我觉得如果你取消引用它的地址,你就会得到修改后的值。正如我在“C和C++中的安全编码”中反复提到的,一旦你调用了未定义的行为,编译器就可以自由地做任何它想做的事情,不包含任何内容。@Wug如果取消引用某个地址,将获得该地址的值。但是在这种情况下,编译器可以自由地假设
i
的值永远不会改变。因为它知道值只能是
100
,所以它只使用常量
100
。另一种可能性是编译器将变量
i
放入只读内存,并且
*j=1导致程序崩溃。“未定义的行为”的要点之一是编译器可以自由地假设它不会发生,并据此进行优化。我不擅长未定义的行为,但我觉得如果您取消对其地址的引用,就会得到修改后的值。正如我在“C和C++中的安全编码”中反复提到的,一旦您调用了未定义的行为,编译器就可以自由地执行任何它想做的事情,包括什么都不做。@Wug如果您取消引用一个地址,您将获得该地址的值。但是在这种情况下,编译器可以自由地假设
i
的值永远不会改变。因为它知道值只能是
100
,所以它只使用常量
100
。另一种可能性是编译器将变量
i
放入只读内存,并且
*j=1导致程序崩溃。“未定义行为”的要点之一是编译器可以自由地假设它不会发生,并因此进行优化。
#include<iostream>
using namespace std;

int main()
{
   const int i=100;
   int *j = const_cast<int*>(&i);
   *j=1;

   cout<<"The value of i is:"<<i<<endl;
   cout<<"The value j holds:"<<*j<<endl;
   cout<<"The address of i is:"<<&i<<endl;
   cout<<"The address of j is:"< <j<<endl;

}
The value of i is:100
The value j holds:1
The address of i is:0xbffbe79c
The address of j is:0xbffbe79c