当程序含有常量时,建议给这些常量命名。程序dweight.c和程序dweight2.c都用到了常量166。在以后阅读程序时也许会有人不明白这个常量的含义,因此可以采用称为 宏定义 (macro definition)的特性给常量命名:
#define INCHES_PER_POUND 166
这里的
#define
是预处理指令,类似于前面所讲的
#include
,因而在此行的结尾也没有分号。
当对程序进行编译时,预处理器会把每一个宏替换为其表示的值。例如,语句
weight = (volume + INCHES_PER_POUND - 1) / INCHES_PER_POUND;
将变为
weight = (volume + 166 - 1) / 166;
效果就如同在前一个地方写的是后一条语句。
此外,还可以利用宏来定义表达式:
#define RECIPROCAL_OF_PI (1.0f / 3.14159f)
当宏包含运算符时,建议用括号(➤14.3节)把表达式括起来。
注意,宏的名字只用了大写字母。这是大多数C程序员遵循的规范,但并不是C语言本身的要求。(至今,C程序员沿用此规范已经几十年了,希望读者不要背离此规范。)
程序 华氏温度转换为摄氏温度
下面的程序提示用户输入一个华氏温度,然后输出一个对应的摄氏温度。此程序的输出格式如下(跟前面的例子一样,用户的输入信息用下划线标注出来):
Enter Fahrenheit temperature: 212 Celsius equivalent: 100.0
这段程序允许温度值不是整数,这也是摄氏温度显示为
100.0
而不是
100
的原因。首先来阅读一下整个程序,随后再讨论程序是如何构成的。
celsius.c
/* Converts a Fahrenheit temperature to Celsius */
#include <stdio.h>
#define FREEZING_PT 32.0f
#define SCALE_FACTOR (5.0f / 9.0f)
int main(void)
{
float fahrenheit, celsius;
printf("Enter Fahrenheit temperature: ");
scanf("%f", &fahrenheit);
celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR;
printf("Celsius equivalent: %.1f\n", celsius);
return 0;
}
语句
celsius = (fahrenheit – FREEZING_PT) * SCALE_FACTOR;
把华氏温度转换为相应的摄氏温度。因为
FREEZING_PT
表示的是常量
32.0f
,而
SCALE_FACTOR
表示的是表达式
(5.0f / 9.0f)
,所以编译器会把这条语句看成
celsius = (fahrenheit – 32.0f) * (5.0f / 9.0f);
在定义
SCALE_FACTOR
时,表达式采用
(5.0f / 9.0f)的
形式而不是
(5 / 9)
的形式,这一点非常重要,因为如果两个整数相除,那么C语言会对结果向下舍入。表达式
(5 / 9)
的值为0,这并不是我们想要的。
最后的
printf
函数调用输出相应的摄氏温度:
printf("Celsius equivalent: %.1f\n", celsius);
注意,使用
%.1f
显示
celsius
的值时,小数点后只显示一位数字。