详解C语言中的符号常量、变量与算术表达式

2020-01-06 14:07:08王旭


printf(" %3d %6dn", fahr, celsius);

打印 fahr 与 celsius 的值,这样,fahr 的值占 3 个数字宽,celsius 的值占 6 个数字宽,输出的结果如下所示:


 0 -17
 20  -6
 40  4
 60  15
 80  26
100  37
...

另一个较为严重的问题是,由于我们使用的是整型算术运算,因此经计算得到的摄氏温度值不太精确,例如,与 0℉对应的精确的摄氏温度应该为-17.8℃,而不是-17℃。为了得到更精确的结果,应该用浮点算术运算代替上面的整型算术运算。这就需要对程序做适当修改。下面是该程序的又一种版本


#include <stdio.h>
/* print Fahrenheit-Celsius table
for fahr = 0, 20, ..., 300; floating-point version */
main()
{
 float fahr, celsius;
 float lower, upper, step;
 lower = 0;
 upper = 300;
 step = 20;
 /* lower limit of temperatuire scale */
 /* upper limit */
 /* step size */
 fahr = lower;
 while (fahr <= upper) {
 celsius = (5.0/9.0) * (fahr-32.0);
 printf("%3.0f %6.1fn", fahr, celsius);
 fahr = fahr + step;
 }
}

这个程序与前一个程序基本相同,不同的是,它把 fahr 与 celsius 声明为 float 类型,转换公式的表述方式也更自然一些。在前一个程序中,之所以不能使用 5 / 9 的形式,是因为按整型除法的计算规则,它们相除并舍位后得到的结果为 0。但是,常数中的小数点表明该常数是一个浮点数,因此,5.0 / 9.0 是两个浮点数相除,结果将不被舍位。

如果某个算术运算符的所有操作数均为整型,则执行整型运算。但是,如果某个算术运算符有一个浮点型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮点型。例如,在表达式 fahr – 32 中,32 在运算过程中将被自动转换为浮点数再参与运算。不过,即使浮点常量取的是整型值,在书写时最好还是为它加上一个显式的小数点,这样可以强调其浮点性质,便于阅读。
在这里需要注意,赋值语句 fahr = lower; 与条件测试语句 while (fahr <= upper) 也都是按照这种方式执行的,即在运算之前先把 int 类型的操作数转换为 float 类型的操作数。

printf 中的转换说明%3.0f 表明待打印的浮点数(即 fahr)至少占 3 个字符宽,且不带小数点和小数部分;%6.1f 表明另一个待打印的数(celsius)至少占 6 个字符宽,且小数点后面有 1 位数字。其输出如下所示:


 0 -17.8
20  -6.7
40  4.4
...

格式说明可以省略宽度与精度,例如,%6f 表示待打印的浮点数至少有 6 个字符宽;%.2f指定待打印的浮点数的小数点后有两位小数,但宽度没有限制;%f 则仅仅要求按照浮点数打印该数。