C++ 将常量int转换为指针?

C++ 将常量int转换为指针?,c++,pointers,casting,C++,Pointers,Casting,可能重复: 我有以下代码: const int x = 5; int *p = (int*)&x; *p = 2; // Line 1 cout << x << " - " << *p << endl; cout << &x << " - " << p << endl; 我知道代码很奇怪,不应该这样做。但我想知道为什么相同的地址却得到不同的结果?而第1行存储数字2的地方?因为无

可能重复:

我有以下代码:

const int x = 5;
int *p = (int*)&x;

*p = 2; // Line 1

cout << x << " - " << *p << endl;
cout << &x << " - " << p << endl;

我知道代码很奇怪,不应该这样做。但我想知道为什么相同的地址却得到不同的结果?而
第1行
存储数字2的地方?

因为无论如何改变一个固有的
常量
变量的值都是未定义的行为[Ref#1]

一旦你做到了:

*p = 2; // Line 1

所有的赌注都被关闭了,而你的代码不再是一个有效的C++代码,一旦写了这行,你就不能期望任何特定的行为。推测为什么一个未定义的行为会给出任何特定的行为是毫无意义的,因为它可以显示任何行为[Ref#2],这就是未定义行为的含义


[参考文献1]
C++03标准7.1.5.1 cv限定符:
第4段:

除了任何声明为可变(7.1.1)的类成员都可以修改外,任何在常量对象的生存期(3.8)内修改常量对象的尝试都会导致未定义的行为

[参考文献2]
C++03标准1.3.24:

允许的未定义行为范围从完全忽略情况和不可预测的结果,到在翻译或程序执行过程中以环境特有的记录方式(有或没有发出诊断消息)行为,再到终止翻译或执行(发出诊断信息)


声明某个
const
可使编译器允许假定该值不会更改。这意味着他们可以使用“立即”指令加载值
5
,而不是引用分配给
x
的位置(如果有)


此外,修改
const
违反了您向编译器提供的关于该“变量”的保证不会被修改,并且可能会产生各种意想不到的行为。

虽然有些编译器确实为常量值分配了地址,但访问它是一个很大的禁忌。得到5-2的原因是编译器直接将x替换为5,即使您修改了地址,如果x为n,则会给它一个地址otconst,除非你通过p*访问x的值,否则无论你做什么,每次都会得到5,而且,p*可能会产生一个未定义的值,因为获取const的地址实际上可能会在某些编译器中失败(我个人认为,对于所有编译器都应该如此)

要求编译器生成一个程序集列表并找出答案。可能会发生什么情况,编译器认为
x
const
(正确的做法)因此,将值内联编译到您的第一个
cout
语句中。我阅读了您引用的文档中的一节,该文档提到了cv限定符。什么是cv限定符?(他们还声明有两个cv限定符:const和volatile)@ipkiss:cv(const volatile)-限定符是(数据)类型限定符它们为(数据)类型对象指定了额外的属性,如常量和波动性。
*p = 2; // Line 1