[简单]printf产生的问题

Liv2005 2008-10-21 12:10:50
请看如下这段程序,本来以为很简单。。。可是结果却和想象中有些不同。。。

#include <stdio.h>
void main()
{
float a=11;
a = a/2;
printf("%d , %f\n",a,a);
printf("%f , %d\n",a,a);
printf("%d\n",a);
printf("%f\n",a);
}
====================================
0 , 0.000000
5.500000 , 0
0
5.500000
Press any key to continue
====================================
问题:
1.为什么第一行输出时,结果都是0?
2.为什么更换了%f和%d的顺序,%f可以正常显示?为什么%d还是0呢?
3.我看以前有人说是逗号表达式。。所以我分开输出了。。。为什么%d还是输出0??(我以为%d会显示5地说。。。)
====================================
我的环境VC6.0+WinXP SP2....我把11和2改成11.0和2.0。。输出结果也是一样的。。
...全文
174 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbh2001 2008-10-21
  • 打赏
  • 举报
回复
printf函数按参数的类型压栈,但却按格式符指定大小解释栈中数据
所以不严格对应类型会出错,不必大惊小怪
anybbs 2008-10-21
  • 打赏
  • 举报
回复
printf在传入参数是没有float(大小4)型的,都扩展成了double(大小8)型的,然后压栈,出栈,因此如果前面的参数出现问题会影响到后面
xhs_lh04 2008-10-21
  • 打赏
  • 举报
回复
printf("%d\n",(int )a); 这样就是对的了,自动取整
xhs_lh04 2008-10-21
  • 打赏
  • 举报
回复
我来回答吧
浮点数用科学计数法的形式存储,存储顺序为: 符号位 指数位 底数位
OK,回到你的问题a =5.5,符号为0,指数为0,故前4字节都为0
整数一般4字节,那正好用%d输出就是0,

另外一个问题,","是运算符,先按%d格式,所以两个都为0

Liv2005 2008-10-21
  • 打赏
  • 举报
回复
原来如此。。。。就是说。。用%d为0是因为栈操作时被截断。。。。第一行全是0是因为逗号表达式的影响。。。。。多少有些明白了。。。谢谢几位的解答。。。。
LiTuX 2008-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 anybbs 的回复:]
printf在传入参数是没有float(大小4)型的,都扩展成了double(大小8)型的,然后压栈,出栈,因此如果前面的参数出现问题会影响到后面
[/Quote]

恩,printf的参数只是两个长度(一般情况):4字节,8字节;这是为了压栈出栈的方便;

printf出栈4或8字节,出几个变量等取决于格式串中的指示,然后(可能)进行截断,再按格式输出。

huli1516 2008-10-21
  • 打赏
  • 举报
回复

printf("%d , %f\n",a,a);
printf("%f , %d\n",a,a);
printf("%d\n",a);
printf("%f\n",a);
[/Quote]

打印结果的时候是不是错了呢?
a应该是要去取地址:printf("%d , %f\n",&a,&a);

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧