鱼C论坛

 找回密码
 立即注册
查看: 4024|回复: 13

printf函数问题

[复制链接]
发表于 2013-4-11 13:18:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小亮1201 于 2013-4-11 13:18 编辑

下面有三段代码,功能都是一样的,为什么运行的结果会不一样呢?求解释???
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. float n1 = 3.0;
  5. double n2 = 3.0;
  6. long n3 = 7890;
  7. long n4 = 123456;

  8. printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);

  9. return 0;
  10. }
复制代码
这段代码运行结果如下:

                               
登录/注册后可看大图

第二段代码:

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. float n1 = 3.0;
  5. double n2 = 3.0;
  6. long n3 = 7890;
  7. long n4 = 123456;

  8. printf("%ld %ld\n", n1, n2);
  9. printf("%ld %ld\n", n3, n4);
  10. return 0;
  11. }
复制代码
  运行结果如下:

                               
登录/注册后可看大图

第三段代码如下:
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4. float n1 = 3.0;
  5. double n2 = 3.0;
  6. long n3 = 7890;
  7. long n4 = 123456;

  8. printf("%ld\n", n1);
  9. printf("%ld\n", n2);
  10. printf("%ld\n", n3);
  11. printf("%ld\n", n4);

  12. return 0;
  13. }
复制代码
运行结果如下:

                               
登录/注册后可看大图





2.png
3.png
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-11 13:19:25 | 显示全部楼层
额....图片上传多了,后面三张图片是多余的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-11 16:06:02 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-11 16:15:38 | 显示全部楼层
1 对参数求值
2 所有参数入栈
3 调用printf

参数求值步骤和这里的主题关系不大 略
参数入栈
printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);
第一个char*入栈之后
分别是
float n1 4个字节
double n2 8个字节
long n3 4个字节
long n4 4个字节
{[][][][]}{[][][][][][][][]}{[][][][]}{[][][][]}
好吧 调用printf
格式控制符 %ld 从后面的数据读取4个字节
{[][][][]}{[][][][][][][][]}{[][][][]}{[][][][]}
格式控制符 %ld 从后面的数据再次读取4个字节
{[][][][]}{[][][][][][][][]}{[][][][]}{[][][][]}
.......
你这里既是砍掉一半啦 又是把float格式当成long格式解释啊
太乱了
全都错了........错太多

评分

参与人数 1鱼币 +3 收起 理由
小亮1201 + 3 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-11 16:26:51 | 显示全部楼层
你这里既是砍掉一半啦 又是把float格式当成long格式解释啊
太乱了
全都错了........错太多

嘿嘿!你没发现吗,三次输出的结果都不相同呢,按你这么说的话,它们访问的都是相同的地址,怎么可能得到不一样的结果呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-11 16:39:04 | 显示全部楼层
小亮1201 发表于 2013-4-11 16:26
嘿嘿!你没发现吗,三次输出的结果都不相同呢,按你这么说的话,它们访问的都是相同的地址,怎么可能得到 ...

你没看懂吗
按照刚刚那个继续下去
切割
格式控制符 %ld 从后面的数据第三次读取4个字节 是原先第2个参数的后半部分
{[][][][]}{[][][][][][][][]}{[][][][]}{[][][][]}

被分尸了

后面的读取的明显不是同一部分

然后我特意把函数调用之前的准备工作提了一遍

1...
2参数入栈
3调用函数

参数入栈之后会 数据都在栈里面了 函数运行过程中直接在栈里面那数据
不会从你的变量n1 n2 n3 n4 哪里拿数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-11 16:47:30 | 显示全部楼层
你没看懂吗
现在我还真没看懂。:L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-11 21:00:53 | 显示全部楼层
真是被感动的痛哭流涕……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-18 17:16:57 | 显示全部楼层
访问地址不一样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-18 17:42:29 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-18 20:48:46 | 显示全部楼层
访问地址不一样吗?
说具体点咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-18 21:16:56 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-19 10:25:11 | 显示全部楼层
上面说的已经很具体了,看看基础方面的就理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-19 10:31:19 | 显示全部楼层
三楼正解哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 22:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表