奇怪的行为,并指出了常数[复制]

问题描述 投票:0回答:1

这个问题已经在这里有一个答案:

在下面的代码,我期待任一可变x放在一个只读存储器,并因此无论我们经由非恒定指针做就可以/参考是没有效果,在这种情况下*y应当等于0或关键字const仅仅是编译时检查,我们可以做任何我们想要在运行时,在这种情况下,两个x*y应该等于20。但是我得到的是x等于0和*y至20 (似乎y没有指向x !!)

#include <iostream>

int main()
{
  const int x = 0 ;
  int *y = (int*) &x ;
  *y = 20 ;

  std::cout << x << std::endl ; //output 0
  std::cout << *y << std::endl ; //output 20

}
c++
1个回答
2
投票

通过优化产生的问题的一个很好的例子,也是为什么你应该使用这样的东西要小心。关键字常量的主要目的就是告诉这个值不会改变编译器和编译器可能(但不是必须)优化它。更effecient只是把使用值20,而不是去记忆和提取的实际值的汇编指令,这是编译器做了什么。因为你允许它。编译器是没有义务遵循指针和实际检查您修改的内容。因此,这是你在这里未定义行为,这是多么的常量的作品。

© www.soinside.com 2019 - 2024. All rights reserved.