当我使用 `float` 而不是 `double` 时,为什么 `sqrt()` 会打印所需的输出?

Why does the `sqrt()` print the desired output when I use `float`s instead of `double`s?

#include <stdio.h>
#include <math.h>

double hypotenuse( double side1, double side2 );

int main( void )
{
    double a, b;

    printf( "Enter the values of the two sides: " );
    scanf( "%f %f", &a, &b );
    printf( "\nThe length of hypotenuse is: %f", hypotenuse( a, b ) );   

    getchar();
    getchar();
    return 0;
}

double hypotenuse( double side1, double side2 )
{
       double c;

       c = (side1 * side1) + (side2 * side2);
       return sqrt( c );
}

当我使用 float a, b; 而不是 double a,b; 时,上述程序有效。为什么?

在您的代码中,您使用

scanf( "%f %f", &a, &b );

但是 %f 用于 float,而不是 double。尝试 %lf 获得 double.

对于 scanf(),说明符 "%f" 需要一个 float * 参数,而不是 double *

double a;
//           v--- &a is type double *, scanf("%f" expects float *
scanf( "%f", &a );

要在 double 中扫描,请使用需要 double * 参数的说明符 "%lf"

double a;
//            v--- &a is type double *
scanf( "%lf", &a );

详细信息:scanf() 的参数是 地址 ,其中 scanf() 可以存储结果。 float *double * 不同。

对于 printf(),数字参数是要打印的 。由于 printf() 采用可变数量的参数,因此它们会经历 通常的 提升,例如 floatdouble。因此 printf("%f", some_float)printf("%f", some_double) 可以使用相同的格式说明符。 通常的 促销不适用于 &a&bscanf(),因为这些参数是指针(地址),而不是算术值。


注意:检查 scanf() 结果总是好的。 "%lf""%lf" 之间的 space 不需要,因为 "%lf" 本身消耗前导白色-space,但它通常在视觉上更容易理解。

if (2 != scanf( "%lf%lf", &a, &b )) Handle_Error();