C 语言定义常量的名字

目录汇总:C 语言入门教程:面向萌新小白的零基础入门教程

当程序含有常量时,建议给这些常量命名。程序 dweight.c 和程序 dweight2.c 都用到了常量 166。在后期阅读程序时也许有些人会不明白这个常量的含义。所以可以采用称为宏定义(macro definition)的特性给常量命名:

1
#define INCHES_PER_POUND 166

这里的 #define 是预处理指令,类似于前面所讲的 #include,因而在此行的结尾也没有分号。

当对程序进行编译时,预处理器会把每一个宏替换为其表示的值。例如,语句

1
weight = (volume + INCHES_PER_POUND - 1) / INCHES_PER_POUND;

将变为

1
weight = (volume + 166 - 1) / 166;

效果就如同在前一个地方写的是后一条语句。

此外,还可以利用宏来定义表达式:

1
#define RECIPROCAL_OF_PI (1.0f / 3.14159f)

当宏包含运算符时,必须用括号把表达式括起来。

注意,宏的名字只用了大写字母。这是大多数 C 程序员遵循的规范,但并不是 C 语言本身的要求。(至今,C 程序员沿用此规范已经几十年了,希望读者不要打破此规范。)

程序 华氏温度转换为摄氏温度

下面的程序提示用户输入一个华氏温度,然后输出一个对应的摄氏温度。此程序的输出格式如下(跟前面的例子一样,用户的输入信息用下划线标注出来):

Enter Fahrenheit temperature: 212
Celsius equivalent: 100.0

这段程序允许温度值不是整数,这也是摄氏温度显示为 100.0 而不是 100 的原因。首先来阅读一下整个程序,随后再讨论程序是如何构成的。

celsius.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/* 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;
}

语句

1
celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR;

把华氏温度转换为相应的摄氏温度。因为 FREEZING_PT 表示的是常量 32.0f,而 SCALE_FACTOR 表示的是表达式 (5.0f / 9.0f),所以编译器会把这条语句看成是

1
celsius = (fahrenheit - 32.0f) * (5.0f / 9.0f);

在定义 SCALE_FACTOR 时,表达式采用 (5.0f / 9.0f) 的形式而不是 (5 / 9) 的形式,这一点非常重要,因为如果两个整数相除,那么 C 语言会对结果向下取整。表达式 (5 / 9) 的值将为 0,这并不是我们想要的。

最后的 printf 函数调用输出相应的摄氏温度:

1
printf("Celsius equivalent: %.1f\n", celsius);

注意,使用 %.1f 显示 celsius 的值时,小数点后只显示一位数字。

(完)

comments powered by Disqus