| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1584 人关注过本帖
标题:一个程序,不知为什么数值会变??
只看楼主 加入收藏
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

tempnetbar 说得很对,问题就出在 printf("x=%d\na=%d\nb=%d\nc=%d\nd=%d\n"); 正因为是你在printf中把x定为d型的缘故

我们先来看看int和double在内存中所占的字节各是多少

int 2字节 double 8字节

你把x=%d放在printf()函数的实参的首位,那么printf()将会把这些数据重新在内存中排列并且按照事先约定好的字节数读取。

这个是系统实际的内存排列 double

x=97.6875 {[]-[]-[]-[]-[]-[]-[]-[]}

int

a=1, b=1, c=1, d=1; {[]-[]-[]-[]}--{[]-[]-[]-[]}--{[]-[]-[]-[]}--{[]-[]-[]-[]}

(每个[]表示内存中1个字节)

这个是你在printf()函数中实际的排列 printf("x=%d\na=%d\nb=%d\nc=%d\nd=%d\n",x,a,b,c,d);

x=%d a=%d b=%d c=%d d=%d

{[]-[]-[]-[]}--{[]-[]-[]-[]}--{[]-[]-[]-[]}--{[]-[]-[]-[]}--{[]-[]-[]-[]}--[]-[]-[]-[]

你可以看到你的数据已经乱了套了(后面还多出4个字节哪),所以你的结果当然会变啦!

如果你把x放在参数表的末尾 即 printf("a=%d\nb=%d\nc=%d\nd=%d\nx=%d\n",a,b,c,d,x);

这样出错的就不是全部的数据了,只有x出了错,因为x本来是8个字节的,而printf()在你的参数下只读了4个,这个就是问题的关键所在。

[此贴子已经被作者于2004-07-22 19:48:03编辑过]


淘宝杜琨
2004-07-22 19:39
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
这个问题可以让初学编程的人更加深刻的理解数据所占内存字节数的含义,对以后的字符串、指针、数组等等有很大的意义。

淘宝杜琨
2004-07-22 19:53
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2004-7-22
收藏
得分:0 
应该是输出时候,double用4b,int用2b来存储,造成混乱
2004-07-22 23:38
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2004-7-22
收藏
得分:0 
说错了,double是8b
2004-07-22 23:42
水汀飘落
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2004-7-22
收藏
得分:0 
应该是x="%1d",..........
2004-07-22 23:57
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

飘落,我们不是在说这个语句错在那里,而是从数据在内存上的存储和读取的角度上去分析 为什么会出现这个混乱的局面

明,事实证明(我去检验过了)我的想法是错误的,但是我也认为你的见解也不完全正确

如果只是8b的内容当4b的内容来存了,那也只会造成x的数据丢失(x不完整了),不会造成其他混乱啊!请你解释一下!


淘宝杜琨
2004-07-23 02:37
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

我认为我的理由在上面的条件下可以成立。

证明:

main() { double x=0; int a=257,b=0,c=0,d=0; printf("\n"); printf("%d %d %d %d %d",x,a,b,c,d); }

这些变量在内存中的存放为: {x}--{a}--{b}--{c}--{d}

{[00]-[00]-[00]-[00]-[00]-[00]-[00]-[00]}--{[05]-[00]}--{[00]-[00]}--{[00]-[00]}--{[00]-[00]}

按照我的分析printf()在这些参数下是这样读的:{x}--{a}--{b}--{c}--{d}

{[00]-[00]}--{[00]-[00]}--{[00]-[00]}--{[00]-[00]}--{[05]-[00]}-[00]-[00]-[00]-[00]-[00]-[00]

推论,输出应该为0 0 0 0 5

这个结果和实际上的输出相吻合,所以在楼主所给的条件下,我的推论是成立的。


淘宝杜琨
2004-07-23 08:49
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 

值得研究!!

我认为:神的说法有待研究,不应该说printf()把变量重新在内存中重新排列,而应该应该说printf()开辟了自己的空间

,在把右边的数据从右到左的计算完后,根据第一个字符串中把几个变量按相同的内存存储方式存储,也就相当与符值一

个个变量的内存到开辟的空间中去,最后根据要显示的格式顺序的读出数据显示,这样理解比较合适!

有时间可以试一下,一个printf()函数可以显示多少个字符最大!!!


差点把你忘了...
2004-07-23 14:47
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

最大?会有什么限制住了printf()呢? 我猜想:如果有必要,可以让printf()在内存允许的条件下尽可能多的显示。

个人意见,没尝试过,也不知道怎么去试啊!


淘宝杜琨
2004-07-23 17:44
buio
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2004-8-5
收藏
得分:0 

本来就是 电脑的最大毛病就是会制作主张 就好像FLSAH里面它会走捷径

所以请务必要输出正确对号入座

printf("x=%f\na=%d\nb=%d\nc=%d\nd=%d\n",x,a,b,c,d);

2004-08-10 20:14
快速回复:一个程序,不知为什么数值会变??
数据加载中...
 
   



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

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