printf()的异常行为?

时间:2012-07-28 17:38:13

标签: c

  

可能重复:
  Using %f to print an integer variable

#include<stdio.h>

int main()
{
    printf("%f",9/5);
    return 0;   
}

输出:0.000000

任何人都可以解释上述程序的输出吗?

不应该是程序的输出是1.000000?

6 个答案:

答案 0 :(得分:5)

printf("%f",9/5);

此声明为未定义行为,因为参数必须为double类型且9 / 5类型为int

使用9 / 5.0生成double类型的参数(以及正确的浮动分区)。

答案 1 :(得分:4)

9/5的类型为int。使用intprintf参数传递给"%f"具有未定义的行为。

如果您需要9.0/5.0,请尝试1.800000;如果需要(double)(9/5)

,请1.000000

答案 2 :(得分:2)

为什么会这样?

因此,通过划分两个整数得到9/5 - 并且将两个整数除以得到整数值,但是,因为它是一个int,并且指定的%f想要一个浮点数,这是未定义的行为

Ps。:你可能想要

9.0 / 5

9 / 5.0

9.0 / 5.0

答案 3 :(得分:1)

Re:不应该是程序的输出是1.000000?

如果您的除法导致浮动值而不是int,那么本来是这样的。由于您尝试使用int格式规范打印%f,因此结果为 undefined 行为。

更多详情:

有两个问题,但有关:

  1. 您正在从您的部门获得int eger结果,但是 使用%f

  2. 尝试浮动值的格式
  3. (你的问题似乎意味着你知道这一点)整数 除法导致整数,这就是%f格式的原因 说明符不合适。当格式说明符和 参数与行为不匹配 undefined

    要避免整数结果,请尝试:

    9.0 / 59 / 5.0或甚至9.0 / 5.0

    获得您期望的结果,然后 %f说明符将适当并按预期工作。

    请注意,在进行整数除法时,结果将是另一个整数。但是,如果操作数的至少一个是浮点数,则另一个操作数也将被提升为浮点值,除法将导致浮点值。

    使用整数除法会得到截断,这意味着结果的小数部分会被丢弃。

答案 4 :(得分:0)

这是因为9/5是1并且是整数类型。小数部分简单地被截断。要实现您的目标,请强制分部使用5.0/95/9.05.0/9.0(float) 5/9

进行浮点运算

当整数参数的类型与%f绑定时,行为未定义。

这在C99标准第7.21.6.1节第9段中有说明。本段引用如下:

  

如果转换规范无效,则行为为   未定义。 如果任何参数不是正确的类型   相应的转换规范,行为未定义。

答案 5 :(得分:0)

答案很简单。 9是整数,5也是整数。当整数除以整数时,结果将为0,并且它将升级到0.00000,因为你在printf()中使用了“%f” 如果您想要正确的结果执行 9.0 / 5 现在你肯定会得到正确的答案