| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 942 人关注过本帖
标题:[讨论]同一地址,值怎么不一样呢
只看楼主 加入收藏
linlin
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2006-3-14
收藏
得分:0 
以下是引用柳儿在2006-3-21 10:49:00的发言:
在C++中, const 变量默认是internal linkage (跟C不同),在一个compilation unit内,其实起的作用跟define差不多,就是直接用值去替换。

按照这句话的意思能说明为什么输出的值不一样。也就是说在同一地址里,可以有不同的值,对吗?柳儿


woyaochengshuyidianle 我真的什么也不会
2006-03-21 11:13
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
不是。那个地址里的值确实变了。但是由于i的值是const,所以在输出i的值的时候直接用了0,而不是从地址里取出的值。

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-03-21 11:29
linlin
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2006-3-14
收藏
得分:0 
柳儿,你真好,我明白了!

woyaochengshuyidianle 我真的什么也不会
2006-03-21 11:39
linlin
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2006-3-14
收藏
得分:0 
柳儿,我会好好学习的,等我事业有成时,再向你告喜!

woyaochengshuyidianle 我真的什么也不会
2006-03-21 11:42
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
linlin,
你的这个问题提得很有意思,我也从来没有考虑过,运行了你的代码,并且单步调试看了,发现这个现象确实难以解释, 问题的关键在这里,
const int i=0;
int* j=(int*)&i; // 这里很明显是首先对 变量 i 取地址, 然后类型强制转换, 如果你把这个 (int *) 去掉,你马上会发现编译就出错了.

我个人认为这是C++ 语言的一个漏洞, 你用Dev和VC 所得到的结果都是一样的, 那就是 i 输出为 0 也就是说 i 的数值没有改变, 而 j 输出为 1 也就是说我们确确实实将 i 的内存地址下的值变掉了. 很遗憾这样的结果是与 const 的定义有矛盾之处了. 所以我觉得, 如果C++ 语言很完善的话, 那么你的这个地址类型的强行匹配从一开始就不能允许, 这样才能保证 const 的 定义不受破坏. 我觉得 C++ 委员会有必要修改规则.

以上为我的个人见解, 不保证正确性.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-03-21 14:42
西部天狼
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2006-2-23
收藏
得分:0 

柳儿说的对
const int i=1相当于用#define定义的常量i,值为1。在编译时期,编译器会在i的作用域中将所有i出现的地方,用1来替换。
即,cout<<i;经过编译后的应该和cout<<1;相当,因此在任何情况下,cout<<i;都会输出值1。也就是说,即使你能在运行时将i变成可改写的,并给这个值赋予新的值,也为时已晚,域内所有用到i的地方都已被替换了。


学习-->编程-->交流-->再学习-->再编程-->再交流
2006-03-21 14:49
linlin
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2006-3-14
收藏
得分:0 

现在真是有点,不过先谢谢大家了!


woyaochengshuyidianle 我真的什么也不会
2006-03-21 15:42
快速回复:[讨论]同一地址,值怎么不一样呢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022124 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved