2.3 常量
2.3.1 常量的概念
在程序运行过程中其值不会发生变化的量,就是平常所说的常量。
C语言的常量有整型常量、实型常量、字符型常量、字符串常量和符号常量五种。
2.3.2 整型常量
C语言对整型常量有三种不同的表示形式。
1.十进制整数
十进制整数是我们最常用的形式,比如100,-36,0,25,-10等。
注意十进制整数不能用0开头,比如9不能表示为09。
2.八进制整数
C语言中用0开头的整数表示八进制整数,如032就是一个八进制整数,它等于十进制整数的26。
八进制整数的数字范围为0~7,即只允许出现0~7这八个数,不能出现像8和9这样的数。
3.十六进制整数
C语言中用0x开头的整数来表示十六进制整数,如0x25就是一个十六进制整数,它的值等于十进制整数的37。-0x1B也是一个十六进制整数,它等于十进制整数的-27。
十六进制整数的数字范围为0~15,其中10~15写为A~F或a~f,数字中只允许出现0~9和A、B、C、D、E、F或a、b、c、d、e、f这几个基本数字和字母。
2.3.3 实型常量
实型常量在C语言中有两种表示方法。
1.十进制小数形式
在这种表示方式中必须用小数点,比如5.0,100.0,-2.3641,0.0等。小数点前面可以没有数字,比如.33表示0.33。
如果不用小数,如27,虽然它的值没有变化,但类型已经不是实型常量了,而是整型常量。
2.指数形式
指数形式的实数由两部分组成,一部分是底数,一部分是指数。底数写在前面,后面紧跟字母e或E,然后是指数部分,比如2.71728e3,0.1541e-3,-6.154e10。
C语言规定,字母e或E前面必须有数字,并且只能有一个数,e后面的指数必须是整数,不能是小数。比如e3,2e3.5,e,.e6等都是不合法的表示形式。
由于指数形式的数值会比较大或者比较小,取值的时候要注意数值有效范围,超出范围的数字可能会引起误差,从而造成运算结果的错误。
2.3.4 字符型常量
字符型常量就是用单引号括起来的字符,它代表ASCII码字符集里面的一个字符。字符型常量区分大小写。
(1)包括'a'~'z'小写英文字母以及'A'~'Z'大写英文字母。
(2)还有'0''1''2''3''4''5''6''7''8''9'这10个数字。注意,9是数字,而'9'是字符,这要分清。
(3)其他一些字符,比如'*''$''%'等。
(4)转义字符,它们是以“\”开头的字符序列。其中“\”是转义的意思,后面跟不同的字符表示不同的意思。常见转义字符及其含义如表2-2所示。
表2-2 常见转义字符及其含义

转义字符的作用有两点,如下面两段程序所示。
【例2.1】使用转义字符表示字符或特殊含义。

【例2.2】使用转义字符表示文件路径。

2.3.5 字符串常量
字符串常量是用双引号括起来的一个或多个字符,其实质是由一个或多个字符型常量构成的字符数组。
例如:"C Language""chinese""what is your name?"等。
字符串常量与字符型常量是两个不同的概念,区别在于:
(1)字符型常量由单引号括起来,字符串常量则由双引号括起来。
(2)字符型常量只能是单个字符,字符串常量则可以包含一个或多个字符。
(3)可以把一个字符型常量赋给一个字符型变量,但不能把一个字符串常量赋给一个字符型变量。在C语言中没有相应的字符串变量,C语言中是用字符数组来存放字符串常量的。
(4)字符型常量占一个字节的存储空间,而字符串常量占的内存字节数等于字符串中字节数加1,即实际字符数加1。增加的这一个字节空间用来存放字符串结束标志符'\0',它的ASCII码为0。例如,一个字符串"C Language"在内存中所占的字节为:

而字符串"a"则表示了两个字符'a'和'\0',其内存占用形式为:

学了数组以后就会知道,字符串在C语言中实际是用数组存储的。例如有一个字符串"C Language",它以数组形式存放,就是:{'C','','L','a','n','g','u','a','g','e','\0'}
其中'\0'是系统自动加上去的,用户不必指定。
2.3.6 符号常量
C语言中,可以用一个标识符来表示一个常量,该常量就被称为符号常量。
符号常量在使用前必须先定义,由预处理命令define定义:

例如:

其中,#define是一条预处理命令,称为宏定义命令。C语言中预处理命令都以“#”开头。它的功能是把该标识符定义为其后的常量。一经定义,以后在程序中所有出现该标识符的地方均以该常量替换。符号常量的标识符习惯上用大写字母表示,这点一定要注意,一般变量的标识符才用小写表示。
使用符号常量的好处主要有两点:
(1)书写简洁,比如书写“PI”就要比书写“3.1415926”简洁得多。
(2)便于修改,比如:

我们用“N”代表“100”,假设“N”表示的是一个班级的人数。如果将来班级的人数有所变动,比如由100变为80,那么我们就不必在程序源代码中一处一处地去寻找替换,只需要在程序头部将这个宏定义修改一下,程序中所有的班级人数就会统一改变过来。
注意
符号常量不等于变量,它和变量是两个概念,绝不相同。这一点在使用时一定要注意区分。