与scanf函数和双打[复制]问题与scanf函数和双打[复制]问题(Problems with s

2019-05-12 12:15发布

这个问题已经在这里有一个答案:

  • 为什么scanf()的需要“%低频”为双打,当printf()的是好的只有“%F”? 5个回答

无法理解为什么出现这种情况IM:用下面的代码;

    #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是123.000017”被打印出来。 我知道,当你使用扫描时,LF%,这是固定的,但为什么用%F当出现这种情况?

Answer 1:

我知道,当你使用扫描时,LF%,这是固定的,但为什么用%F当出现这种情况?

之间的差别printfscanf函数参数是你值传递给printf ,但scanf传递指针(即值的地址)。 据到C规则,当一个函数采用可变数量的参数,所有参数进行默认的促销活动

其中一个促销的是, float小号地转化为double ,以同样的方式, short小号地转化为int 。 这就是为什么你可以使用%f%lfprintf :这两种类型的值由编译器转换成double ,因此其访问是安全的。

然而,对于指针没有这样的规则(和一个很好的理由:试图写一个double成的空间float将是不确定的行为)。 这就是为什么你必须区分%f%lf传递参数的时候scanf系列函数。



Answer 2:

 scanf("%f", &x);

应该

 scanf("%lf", &x);

有浮动之间的点转换说明一个假对称printfscanf

还要注意的是lf转换符相当于f转换说明中printf (因为C99,它之前未定义)。

我知道,当你使用扫描时,LF%,这是固定的,但为什么用%F当出现这种情况?

f在转换指定scanf需要类型的指针的参数float 。 通过传递指针类型的参数double调用未定义的行为。



文章来源: Problems with scanf and doubles [duplicate]
标签: c scanf