为什么使用printf输出不同?

时间:2015-11-17 20:50:57

标签: c

在某些地方,命令printf("%f\n", 5 / 2);是不同的。 为什么,以及如何解决这个问题?

int main()
{
    int a = 65;
    char c = (char)a;
    int m = 3.0/2;
    printf("%c\n", c);              // output: A
    printf("%f\n", (float)a);       // output: 65.000
    printf("%f\n", 5 / 2);          // output: 65.000
    system("PAUSE");
    printf("%f\n", 5.0 / 2);        // output: 2.5000
    printf("%f\n", 5 / 2.0);        // output: 2.5000
    printf("%f\n", (float)5 / 2);   // output: 2.5000
    printf("%f\n", 5 / 2);          // output: 2.5000
    system("PAUSE");
    printf("%f\n", 5 / (float)2);   // output: 2.5000
    printf("%f\n", (float)(5 / 2)); // output: 2.0000
    printf("%f\n", 5 / 2);          // output: 2.0000
    system("PAUSE");
    printf("%f\n", 5.0 / 2);        // output: 2.5000
    printf("%d\n", m);              // output: 1
    printf("%f\n", 5 / 2);          // output: 2.5000


    system("PAUSE");
    return(0);
}

1 个答案:

答案 0 :(得分:3)

5/2给出一个整数作为结果,而不是浮点数,而printf不能自动转换为另一种类型,因为赋值可以。如果使用GCC进行编译,则会收到警告“format'%f'需要类型为'double'的参数,但参数2的类型为'int'”。 (是,double。所有浮点数在被发送到像printf这样的变量参数函数之前都会被转换为双精度。)

您发送的参数(整数)与格式字符串%f不匹配。根据C标准,这将导致它所谓的“未定义行为”,这意味着任何事情都可能发生。然而,通常发生的是,printf将查看浮点数所在的内存中的位置,如果你已经发送了一个作为参数,并采取它在那里找到的任何东西并解释它作为一个浮点数。由于典型的int是32位,典型的double是64位,因此printf将获取一些其他数据,可能是之前调用的数字65!

要解决此问题,请向printf发送一个浮点数,例如使用5.0/2(double)5/22.5代替5/2