4.3 常量和C预处理器
circumference = 3.14159 * diameter;
输入实际值并可使用这个常量。然而,这种情况使用符号常量(symbolic constant)会更好。例如:
circumference = pi * diameter;
符号常量比字面值常量更好:
*常量名比数字表达的信息更多;
*假如程序中多处使用一个常量,有时需要改变它的值。使用符号常量,则只需改动符号常量的定义,不用在程序中查找使用常量的地方,然后逐一修改。
创建符号常量:
C预处理用来定义常量。例如:
#define pi 3.14159
编译程序时,程序中所有的pi都将替换成3.14159。这一过程称为编译时替换(compile-time substitution)。在运行程序时,程序中所有的替换均已完成。通常,这样定义的常量也称为明示常量(manifest constant)。
明示常量格式:
#define 符号常量名 符号常量值
其通用格式如下:
#define NAME value
注意,末尾不用加分号,因为这是一种预处理器的替换机制。
用大写表示符号常量是C语言一贯的传统。这样,在程序中看到全大写的名称就立刻明白这是一个符号常量,而非变量。大写常量可以提供程序的可读性。
另外,还有一个不常用的命名约定,即在名称前面带c_或k_前缀来表示常量。
符号常量的命名规则与变量相同。
/* pizza.c -- uses defined constants in a pizza context */
#include
#define PI 3.14159
int main(void)
{
float area, circum, radius;
printf("What is the radius of your pizza?\n");
scanf("%f", &radius);
area = PI * radius * radius;
circum = 2.0 * PI *radius;
printf("Your basic pizza parameters are as follows:\n");
printf("circumference = %1.2f, area = %1.2f\n", circum,
area);
return 0;
}
/* 输出:

*/
%1.2f表明,结果被四舍五入为两位小数输出。
#define指令还可定义字符和字符串常量。前者使用单引号,后者使用双引号。
记住,符号常量名后面的内容被用来替换符号常量。
4.3.1 const限定符
C90标准新增了const关键字,用于限定一个变量为只读。用const类型限定符声明的是变量,不是常量。
const用起来比#define更灵活。
4.3.2 明示常量
C头文件limits.h和float.h分别提供了与整数类型和浮点类型大小限制相关的详细信息。每个头文件都定义了一系列供实现使用的明示常量。(编译器要完全支持C99标准才能识别LLONG_MIN标识符)
float.h中的一些明示常量
FLT_MANT_DIG float类型的尾数位数
FLT_DIG float类型的最少有效数字尾数(十进制)
FLT_MIN_10_EXP 带全部有效数字的float类型的最小负指数(以10为底)
FLT_EPSILON 1.00和1.00大的最小float类型值之间的差值。
// defines.c -- uses defined constants from limit.h and float.
#include
#include
#include
int main(void)
{
printf("Some number limits for this system:\n");
printf("Biggest int: %d\n", INT_MAX);
printf("Smallest long long: %lld\n", LLONG_MIN);
printf("One byte = %d bits on this system.\n", CHAR_BIT);
printf("Largest double: %e\n", DBL_MAX);
printf("Smallest normal float: %e\n", FLT_MIN);
printf("float precision = %d digits\n", FLT_DIG);
printf("float epsilon = %e\n", FLT_EPSILON);
return 0;
}
/* 输出:
*/