C中的无限循环

时间:2012-02-05 11:51:48

标签: c loops for-loop infinite-loop

初学者。 为什么这是一个无限循环?

for (p = 0; p < 5; p += 0.5)
{
    printf("p=%2.2f\n",p);
}

5 个答案:

答案 0 :(得分:8)

您会看到无限循环,因为您的p是整数类型(例如int)。无论将0.5添加到int多少次,它都将保持为0,因为int会截断分配给它的double / fp值。换句话说,它相当于一个循环,你在每一步上加零。

如果您p floatdouble,您的问题就会消失。

编辑(建议由Oli Charlesworth发表评论)

值得注意的是,不鼓励使用浮点数和双精度来控制循环,因为结果并不总是像示例中那样干净。将步长从0.5(2为1的负幂)更改为0.1(这不是2的积分负幂)将改变您以相当意外的方式看到的结果。

如果需要迭代非整数步骤,则应考虑使用这种简单模式:

// Loop is controlled by an integer counter
for (int i = 0 ; i != 10 ; i++) {
    // FP value is calculated by multiplying the counter by the intended step:
    double p = i * 0.5;
    // p is between 0 and 4.5, inclusive
}

答案 1 :(得分:4)

我认为这取决于p的声明方式。如果它是整数类型,p将始终为0(因为0 + 0.5的结果每次都会被截断为0),因此for永远不会停止。

答案 2 :(得分:1)

类型转换问题,分配给整数类型时浮点/双精度丢失。

P.S。在条件测试中使用float / double确实是一个非常坏主意。并非计算机中的所有浮点数都是准确的。

答案 3 :(得分:0)

如果pfloatdouble,则代码没有任何问题,循环将终止。

如果p是整数,则代码的行为是未定义的,因为printf()中的格式说明符是错误的。

答案 4 :(得分:0)

当你将double常量添加到整数变量时,双常量“变为”整数。 0.5变为0。所以你将0添加到p。