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呢?
我需要详细解答...
展开
 我来答
porker2008
推荐于2016-09-15 · TA获得超过1.4万个赞
知道大有可为答主
回答量:7066
采纳率:62%
帮助的人:1.1亿
展开全部
#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

hactrox
2014-07-19 · TA获得超过592个赞
知道小有建树答主
回答量:263
采纳率:66%
帮助的人:214万
展开全部
a的值直到程序结束都没有被改变,所以a=10
因为有这么条语句b=a,所以b被赋值10,所以输出10
表面上看起来这个程序是错的,其实不然,楼主把const a定义在了函数体里面,函数体里面的变量存储在堆栈中。此时如果用指针指向其中的变量,是能够改变的。但是如果把const a放在函数体外面,即全局变量中,那么程序就会报错,因为全局的const变量不允许被修改。函数体中的话不应该被修改,但是想改还是能改的。
追问
看我上面采纳的答案才是正确的 不过还是谢谢你了 大家共同学习,共同进步!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gmk25492312
2014-07-19 · 超过21用户采纳过TA的回答
知道答主
回答量:65
采纳率:0%
帮助的人:39.7万
展开全部
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 *表明定义的是一个成员为指针的数组。
追问
看我上面采纳的答案才是正确的 不过还是谢谢你了 大家共同学习,共同进步!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式