Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398471
  • 博文数量: 76
  • 博客积分: 3016
  • 博客等级: 中校
  • 技术积分: 782
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-27 12:05
文章分类

全部博文(76)

文章存档

2017年(1)

2015年(1)

2009年(2)

2008年(28)

2007年(44)

我的朋友

分类: C/C++

2007-12-19 18:14:27

#include <stdio.h>

int main()
{
    float fahr,celsius;
    int lower,upper,step;
    lower = 0;
    upper = 300;
    step = 20;
    fahr = lower;
    while (fahr <= upper) {
        celsius = 5 / 9 * (fahr-32);
        printf("wrong:%3.0f\t%6.1f\n",fahr,celsius);
        fahr = fahr + step;
    }
    return 0;
}



#include <stdio.h>

int main()
{
        float fahr,celsius;
        int lower,upper,step;
        lower = 0;
        upper = 300;
        step = 20;
        fahr = lower;
        while (fahr <= upper) {
                celsius = 5 * (fahr-32) / 9;
                printf("correct:\t%3.0f\t%6.1f\n",fahr,celsius);
                fahr = fahr + step;
        }
        return 0;
}


这两个程序看上去差不多,就是其中一行表达式的写法上有点差异,理论上应该是一样的输出,但其实不同。
第一个输出的 celsius 全是 0,而第二个能得到正确的答案。

原因在于 C 语言对于 5/9,这样的表达式,会把当成是两个整数相除,因此 C 自动对这一步的结果取整,最后的输出也就会全 0 了。根据 K&R 的说话,不仅仅是 C 语言这样处理的,还有很多语言也是这样的。

所以最好的程序写法应该是人为地用 5.0/9.0,强迫它认为是两个浮点数相除。在 fahr-32 这一表达式中,C 语言会对 32 自动进行整型数到浮点数的转换。所以好习惯就是写成 fahr-32.0,提醒自己这个 fahr 是 float 型变量。还有一个技巧也可以绕过这个问题,把 celsius = 5 / 9 * (fahr-32),像第二个例子那样写成 celsius = 5 * (fahr-32) / 9这其实是利用了 C 语言的强制类型转换。

综上,最好的写法如下:

#include <stdio.h>

int main()
{
        float fahr,celsius;
        int lower,upper,step;
        lower = 0;
        upper = 300;
        step = 20;
        fahr = lower;
        while (fahr <= upper) {
                celsius = 5.0 * (fahr-32.0) / 9.0;
                printf("%3.0f\t%6.1f\n",fahr,celsius);
                fahr = fahr + step;
        }
        return 0;
}

阅读(1667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~