为什么写 scanf("%f",&r); 程序就错了,而写scanf("%lf",&r);就对了呢?输入的r是1.5 h是3,求解

#include <stdio.h>
#include <math.h>
void main()
{
const double pi=4.0*atan(1.0);
double r,h,zhouchang,mianji,qiumianji,qiutiji,zhutiji;
printf("please input r\n");
scanf("%lf",&r);
printf("please input h\n");
scanf("%lf",&h);
zhouchang=2*r*pi; /*圆周长*/
mianji=pi*r*r; /*圆面积*/
qiumianji=4*pi*r*r; /*球表面积*/
qiutiji=4*pi*r*r*r/3; /*球体积*/
zhutiji=mianji*h; /*圆柱体积*/
printf("圆周长=%.2f 圆面积=%.2f 球表面积=%.2f 球体积=%.2f 圆柱体积=%.2f\n",zhouchang,mianji,qiumianji,qiutiji,zhutiji);

}

因为你定义的变量r,h都是double类型的,如果你输入的时候用%f,那么可能编译能通过,但是会有警告,运行的时候就会出现问题,因为你要是按%f输入一个浮点类型的数,那么存储变量的时候,每个变量会占四个字节,而当你用到变量时,是double类型的,会出去八个字节,这八个字节可能四个是你输入的,剩下的那四个就是属于垃圾数据了,所以不行,而当你用%lf输入时,存储是八个字节,用的时候也是八个字节,所以就没问题了。追问

嗯,知道了。但是 c程序设计 谭浩强 这本书上说不管是float还是double 都可以用%f输入的,这是怎么回事呢,难道书错了?

追答

说实话,那本书很坑爹的,现在都说不怎么好,我建议你看一下C primer plus 这个还不错,我最近就在看

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-19
因为你定义的是double型数据,%lf的意思是long float,如果你数据定义为float,那么用%f就是对的
第2个回答  2012-03-19
你定义的是double类型啊
第3个回答  2012-03-19
数据类型不匹配
相似回答