2

我无法理解为什么会发生这种情况:使用以下代码;

    #include <stdio.h>

    int main() 
    {
        double x=123;

        printf("x is %f. Enter a new value for x.\n", x);
        scanf("%f", &x);
        printf("x is %f\n", x);

        return 0;
    }

当您输入 45678 作为 x 的新值时,将打印“x is 123.000017”。我知道当您在扫描时使用 %lf 时会解决此问题,但为什么在使用 %f 时会出现这种情况?

4

2 回答 2

3

我知道当您在扫描时使用 %lf 时会解决此问题,但为什么在使用 %f 时会出现这种情况?

printfscanf函数参数之间的区别在于您将值传递给printf,但scanf传递给您的是指针(即值的地址)。根据 C 规则,当函数采用可变数量的参数时,所有参数都会进行默认提升

促销之一是floats 转换为,与s转换为double的方式相同。这就是您可以使用or with的原因:编译器会将这两种类型的值转换为,因此访问它们是安全的。shortint%f%lfprintfdouble

但是,指针没有这样的规则(并且有一个很好的理由:尝试将 adouble写入空间 offloat将是未定义的行为)。这就是为什么您必须区分%f以及%lf何时将参数传递给scanf函数族。

于 2013-11-10T14:25:43.520 回答
1
 scanf("%f", &x);

应该

 scanf("%lf", &x);

printf和之间的浮点转换说明符存在错误对称性scanf

另请注意,lf转换说明符等同于f转换说明符printf(从 c99 开始,之前未定义)。

我知道当您在扫描时使用 %lf 时会解决此问题,但为什么在使用 %f 时会出现这种情况?

fin 中的转换说明符scanf需要一个指向float. 通过将类型指针的参数传递给double您调用未定义的行为。

于 2013-11-10T14:18:56.997 回答