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
}