love码 发表于 2018-9-28 01:40:46

请各位大佬看一下这个代码错在哪了(很简单的)!

我想求的是圆的面积(用3.14159),任意输入一实数,出来圆的面积(保留两位小数),请看看(本人是小白),谢谢!


#include <stdio.h>


int main()
{
    double r,area;
    scanf("%f",&r);
    area=3.14159*r*r;
    printf("%.2f",area);

    return 0;
}

claws0n 发表于 2018-9-28 02:39:00

scanf("%lf",&r);

湫湫猪 发表于 2018-9-28 07:49:19

把f都改成lf试试

pheron 发表于 2018-9-28 09:27:29

%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。
其中:
float,单精度浮点型,对应%f.
double,双精度浮点型,对应%lf.
在用于输出时:
float类型可以使用%lf格式,但不会有任何好处。
double类型如果使用了%f格式可能会导致输出错误。
在用于输入时:
double 类型使用了%f格式,会导致输入值错误。
float类型使用double类型不仅会导致输入错误,还可能引起程序崩溃

西瓜小刚 发表于 2018-9-28 09:49:16

楼主看看 四楼的解答就知道了很清楚

pheron 发表于 2018-9-28 10:28:25

pheron 发表于 2018-9-28 09:27
%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。
其中:
float,单精度浮点型 ...

Emmmmmmmm.....想了想有点问题,于是查了一下,结果:{:10_245:}


问:有人告诉我不能在printf中使用%lf。为什么printf()用%f输出double型,而scanf却用%lf呢?

答:printf的%f说明符的确既可以输出float型又可以输出double型。 根据"默认参数提升"规则(在printf这样的函数的可变参数列表中 ,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。

对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。

claws0n 发表于 2018-9-28 15:08:02

pheron 发表于 2018-9-28 09:27
%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。
其中:
float,单精度浮点型 ...

不会崩溃,或者说不算崩溃。scanf() 是接受指针,但是如果数据类型不匹配,将放弃修改。对未初始化的局部变量而言,会是原有的垃圾值。
printf() 是输出格式化,对数据是没有影响的 %f 默认是 6 位小数而已,double 也可以用。

float a = 0.5; //对很多编译器而言,在没有写 0.5f 的情况下,是 double 类型

pheron 发表于 2018-9-28 15:16:53

claws0n 发表于 2018-9-28 15:08
不会崩溃,或者说不算崩溃。scanf() 是接受指针,但是如果数据类型不匹配,将放弃修改。对未初始化的局部 ...

如果工程比较大的话会有崩溃的可能吧{:10_281:}

claws0n 发表于 2018-9-28 15:23:33

pheron 发表于 2018-9-28 15:16
如果工程比较大的话会有崩溃的可能吧

应该是说崩溃的原因不是 scanf(),而是其他的代码发现到数据类型不匹配,或者是溢出的现象才会崩溃,往往是运算结果错误。没错工程比较大的话,会有运算误差放大的问题。

所谓的崩溃应该是在当下的代码就走不下去了,scanf() 是走得下去的

小小丑 发表于 2018-9-28 19:44:09

那个%f对应的是float型,你定义的double型
页: [1]
查看完整版本: 请各位大佬看一下这个代码错在哪了(很简单的)!