C++ 从常量int到int的转换会产生奇怪的结果。有人能解释奇怪结果的原因吗

C++ 从常量int到int的转换会产生奇怪的结果。有人能解释奇怪结果的原因吗,c++,c,C++,C,当我尝试下面的代码时,我得到了奇怪的结果。我试图通过使用指针来更改常量的值。但是当我输出结果指针值和原始变量值时,它给出了两个不同的值。有人能解释当显式转换发生时会发生什么吗 int main() { int *p ; const int a = 20; p=(int *)&a; *p = *p +10; cout<<"p is"<<*p<<"\na is"<<a; } intmain() { in

当我尝试下面的代码时,我得到了奇怪的结果。我试图通过使用指针来更改常量的值。但是当我输出结果指针值和原始变量值时,它给出了两个不同的值。有人能解释当显式转换发生时会发生什么吗

int main()
{
    int *p ;
    const int a = 20;
    p=(int *)&a;
    *p = *p +10;
    cout<<"p is"<<*p<<"\na is"<<a;
}
intmain()
{
int*p;
常数INTA=20;
p=(int*)&a;
*p=*p+10;

cout首先-你真的不应该这样做。
const
是一个常量,意思是不要改变它!:)

现在来解释发生了什么(我认为):

堆栈上的空间被分配给两个变量,
p
a
。这是为
a
完成的,因为它被一个地址引用。如果删除
p
,也会有效地删除
a

数字
20
确实被写入
a
变量,并通过
p
修改为
30
,这就是正在打印的内容


打印的
20
是在编译时计算的。由于它是一个
常量,编译器将其优化并替换为
20
,就像您定义了一个20

,这是未定义的行为

编译器可以假设没有任何东西会改变const对象的值。编译器知道“A”的值是20。你告诉了编译器。因此,编译器实际上继续编译

cout << "p is" << *p << "\na is" << 20;
不能不要那样做

如果你在C++中用显式的代码编写这个代码,你会得到这样的东西:

int main()
{
    int *p ;
    const int a = 20;
    p= const_cast<int*>(&a); // the change
    *p = *p +10;
    cout<<"p is"<<*p<<"\na is"<<a;
}
intmain()
{
int*p;
常数INTA=20;
p=const_cast(&a);//更改
*p=*p+10;

CUT< P> C和C++都表示,修改任何一个用“代码> > const < /Cult>限定符声明的对象都会导致未定义的行为。


因此,当
a
is对象是const限定的时,
*p=*p+10;
语句调用未定义的行为。

虽然它被定义为未定义的行为(正如其他人告诉您的那样),但可能是编译器分配了存储位置(int)对于const int;这就是为什么
*p=*p+10
有效,但可能在输出语句中用值20重新绘制了
a
,因为它应该是常量。

我正在尝试更改常量的值为什么?!??:为什么Mayjaic可能是重复的?这个家伙正在努力学习一些东西。就像在所有这些骗子中一样,你不能改变常数数据,因为它是常数。C++的草案7.7.1节():“在其生命周期中修改任何一个对象的尝试(3.8)导致不明确的行为”。这里的关键点是,将
const
对象隐藏在指向非
const
类型的指针后面,并不会使其减少
const
,也不会以某种方式为其定义任何修改行为。如果要使用任何
const
数据,这就是购买
const
正确性的基本原因。
int main()
{
    int *p ;
    const int a = 20;
    p= const_cast<int*>(&a);
    *p = *p +10;
    cout<<"p is"<<*p<<"\na is" << 20; // const fold
}