c++程序运行结果 求大神指点...
#include<iostream>usingnamespacestd;intmain(void){constinta=10;intb=0;int*p=(int*)&a;...
#include<iostream>
using namespace std;
int main(void)
{
const int a = 10;
int b = 0;
int *p = (int*)&a;
*p = 100;
b = a;
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
cout<<"*p= "<<*p<<endl;
return 0;
}
为什么输出结果a = 10,b = 10 而*p = 100呢?
我需要详细解答... 展开
using namespace std;
int main(void)
{
const int a = 10;
int b = 0;
int *p = (int*)&a;
*p = 100;
b = a;
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
cout<<"*p= "<<*p<<endl;
return 0;
}
为什么输出结果a = 10,b = 10 而*p = 100呢?
我需要详细解答... 展开
3个回答
展开全部
#include<iostream>
using namespace std;
int main(void)
{
const int a = 10;
int b = 0;
int *p = (int*)&a;
*p = 100; // Undefined Behavior 未定义行为
b = a;
cout << "a= " << a << endl; // 这里是因为编译器优化的原因,编译阶段把这里的a优化成常数10了
cout << "b= " << b << endl;
cout << "*p= " << *p << endl; // 上面通过p修改a的行为是未定义的,这里输出什么都是可能的,取决于编译器处理,在你的情况下就是输出了修改后p指向地址的值,就是100
return 0;
}
把a的声明加上volatile的话,编译器就不会做优化a为10的操作了,因为volatile声明过的变量,总是会从内存读取的
volatile const int a = 10; // volatile
追问
我在debug和release版本下测试是同样地结果,为什么说是优化呢?
而且我查看内存的时候,a的值确实呗改变了,但是输出的时候又变回去了... 求解答
ok 我刚也想到了这个是易变的 哈哈, 多谢你了...
追答
因为a被声明为const了,所以编译器就会想,这个a是绝对不会变的,所以在编译阶段的时候
cout << a << endl;
的汇编就会变成
cout << 10 << endl;
所以输出的时候并没有去看a的内存是多少,而是简单的输出10
展开全部
a的值直到程序结束都没有被改变,所以a=10
因为有这么条语句b=a,所以b被赋值10,所以输出10
表面上看起来这个程序是错的,其实不然,楼主把const a定义在了函数体里面,函数体里面的变量存储在堆栈中。此时如果用指针指向其中的变量,是能够改变的。但是如果把const a放在函数体外面,即全局变量中,那么程序就会报错,因为全局的const变量不允许被修改。函数体中的话不应该被修改,但是想改还是能改的。
因为有这么条语句b=a,所以b被赋值10,所以输出10
表面上看起来这个程序是错的,其实不然,楼主把const a定义在了函数体里面,函数体里面的变量存储在堆栈中。此时如果用指针指向其中的变量,是能够改变的。但是如果把const a放在函数体外面,即全局变量中,那么程序就会报错,因为全局的const变量不允许被修改。函数体中的话不应该被修改,但是想改还是能改的。
追问
看我上面采纳的答案才是正确的 不过还是谢谢你了 大家共同学习,共同进步!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
const int a = 10;
int b = 0;
int *p = (int*)&a;
a=10 b=0 int *p 是表示P为整数指针,(int*)&a;是整形变量。 int *p = (int*)&a;表示P的存储地址指向a ,*p = 100; b=a cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
cout<<"*p= "<<*p<<endl;
输出a b *p值,a=b=10 ,a值赋值给b, int *p=int (*a):(*a)
------------------------------------------------------------------------------------------
注释:
int *p=int (*p):(*p)表明a是一个指针,int 表明这是一个指向int 的指针;
int &p=int (&p):(&p)表明a是一个引用,int 表明这是一个引用int 的引用;
int *p[5]:(int *)(p[5]) p[5] 表明定义的是一个数组,int *表明定义的是一个成员为指针的数组。
int b = 0;
int *p = (int*)&a;
a=10 b=0 int *p 是表示P为整数指针,(int*)&a;是整形变量。 int *p = (int*)&a;表示P的存储地址指向a ,*p = 100; b=a cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
cout<<"*p= "<<*p<<endl;
输出a b *p值,a=b=10 ,a值赋值给b, int *p=int (*a):(*a)
------------------------------------------------------------------------------------------
注释:
int *p=int (*p):(*p)表明a是一个指针,int 表明这是一个指向int 的指针;
int &p=int (&p):(&p)表明a是一个引用,int 表明这是一个引用int 的引用;
int *p[5]:(int *)(p[5]) p[5] 表明定义的是一个数组,int *表明定义的是一个成员为指针的数组。
追问
看我上面采纳的答案才是正确的 不过还是谢谢你了 大家共同学习,共同进步!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询