虽然昨天已经看玩了数据类型,但是并没有做习题,本以为会很轻松,谁知遇到了一个神奇的问题:
书上说%f对应的是float 和double 两种类型,lf%对应的是long double 这个很容易理解,在c prime plus中描述:
- 它们向那些没在原型中休闲时说明参数类型的函数(如pintf())传递参数时,c自动将float类型的参数转换为double类型。
但是,今天习题测试程序中 scanf表现好像不是这样;
double a,b;
a=3.156e7;
scanf("%f",&b);
printf("%f",a*b);
上述代码的结果是混乱的;
我最初不知道是这里出了问题,还以为是浮点型计算的问题,由于浮点型在内存中储存方式的特点,我以为乘法计算必然出现错误。
于是我将b改为了int(b代表的参数是年份);
double a;
int b;
a=3.156e7;
scanf("%d",&b);
printf("%f",a*b);
果然解决了问题,不过我很纳闷,难道浮点数不能做乘法计算?那c语言也太low了,这点应该不算难。
于是我在网上查了浮点乘法,我发现我错了,对不起小c!
实际是scanf如果对应变量是一个double类型的话
必须使用%lf,这是我没想到的,因为c prime plus的解释让我以为printf 和 scanf是一样的,事实上这两个函数也经常被一起提起。
明白了
double a,b;
a=3.156e7;
scanf("%lf",&b);
printf("%f",a*b);
没问题了
又或者
float a,b;
a=3.156e7;
scanf("%f",&b);
printf("%f",a*b);