C语言 scanf 和 printf 函数double 类型区别

C 语言中,scanf 和 printf 函数用来处理 float 和 double 类型的数据时,使用的格式说明符略有不同。特别是在处理 double 类型时,scanf 需要使用 lf,而 printf 使用 f 即可。这是因为它们在 C 标准中的行为有所不同。

1、printf 和 scanf 在类型处理上的区别

printf 函数用于输出数据时,%f 格式说明符可以同时处理 floatdouble 类型的数据。这是因为在 C 标准中,所有浮点数类型(floatdouble)在 printf 中都会被提升为 double。因此,即使传入的是 float,它会自动转换为 double 类型传递给 printf,并且仍然可以通过 %f 格式说明符进行打印。

scanf 函数用于输入数据时,%f 格式说明符仅适用于 float 类型,而 double 类型则需要使用 %lf。这是因为在 scanf 中,%f 只对应 float,而 double 类型必须显式地用 lf 来指定。换句话说,scanf 不会自动将 float 类型提升为 double 类型,它需要显式地通过 lf 来指示读取一个 double 类型的变量。

#include <stdio.h>

int main() {
    double num1, num2;
    
    // 使用 scanf 读取 double 类型数据
    printf("请输入两个浮动数值 (double 类型): ");
    scanf("%lf %lf", &num1, &num2);

    // 使用 printf 打印 double 类型数据
    printf("你输入的两个数分别是: %.2f 和 %.3f\n", num1, num2);

    // 演示不同格式化方式
    printf("num1 的科学计数法表示: %.2e\n", num1);
    printf("num2 的科学计数法表示: %.3e\n", num2);

    return 0;
}

2、scanf 需要使用 lf 而不是 f的原因

 C 语言中,scanffloatdouble 的处理严格区分。当使用 %f 时,scanf 期望传入的是一个 float * 类型的指针,因此如果你传递的是 double * 类型,程序可能会发生错误。

为了保证数据的正确性,scanf 使用 %lf 来明确表示它将读取一个 double 类型的值。这是因为,float类型需要使用 %f,而 double 需要使用 %lf 来明确指示。

3、scanf 读取 double 类型

使用 scanf 时,读取 double 类型数据时,应该使用格式说明符 %lf。虽然 doublefloat 都可以使用 %f,但在 scanf 中,%f 用于读取 float 类型,%lf 用于读取 double 类型。

#include <stdio.h>

int main() {
    double d;
    scanf("%lf", &d);  // 注意这里使用 %lf
    printf("You entered: %f\n", d);  // 输出时 %f 也可以
    return 0;
}

4、printf 输出 double 类型

printf 中,double 类型和 float 类型都使用 %f 格式说明符,float 会自动提升为 double 来输出。因此,输出时没有必要使用 %lf,可以直接使用 %f

#include <stdio.h>

int main() {
    double d = 3.14159;
    printf("Value of d: %f\n", d);  // 使用 %f 输出 double
    return 0;
}

推荐阅读
cjavapy编程之路首页