是死循环!

#include<stdio.h>
int main(){
    double i;
    for(i=0;i!=10.0;i+=0.1)
    printf("%.1f\n",i);

    return 0;
}
之所以无限循环,那么就可以推断是for 循环的条件始终成立,即 i 始终不等于10.
但是 i 是从0开始的,每次都自加0.1.那么应该是100次后就停止.为什么i始终不
 
   等于10呢? 是因为浮点数的原因. 我们把10改成10.0,结果仍然是无限循环.
 
   我们把 i += 0.1 改成 i++,发现执行10次后正常停止.我们可以初步推断,是浮点数
 
   的加法运算引起的.
 
   接下来调用gdb输出中间结果来观察,发现 i 自加0.1后,并不是我们预想的等于0.1
 
   而是等于 0.10000000000000001.
再往下执行几次,i 的值分别是0.20000000000000001.
 
                                          0.30000000000000004.      
 
                                          0.40000000000000002.
 
       这样,我们就理解了为什么i 始终不等于10. 因为浮点数在进行小数运算的时候由于
 
   精度问题,会有很小的误差,然而用 = 或者 != 这样的运算符来比较,是会检测出这种
 
   误差的.所以导致结果的不正确. 
 
   我们还可以多测试一下,将循环条件改为 i != 0.1 或者 i != 0.2时,程序能够正常
 
   运行,得到正常结果.但是当i != 0.3时,就是无限循环.显然,在我们的程序中,这种
不确定的错误是不应该存在的.
 
   因此,在定义循环变量时,尽量采用int型及整数的加减.因为循环的本质意义就是通过
 
   各种条件来控制语句重复运行次数.而这个次数本身就是整数.要实现小数的功能尽量
 
   通过循环中的语句来实现. 

猜你喜欢

转载自blog.csdn.net/legends_never_die/article/details/78508267