常量
常量,顾名思义,就是在程序运行期间,固定不变的量,这些固定的值,又被称做字面量。
常量可以是任何的基本数据类型,包括整型数字、浮点数字、字符、字符串和布尔值。
程序运行期间,内存中有一块不可写区域用来存放常量。
常量分类
| 常量 | 说明 | 
|---|---|
| 整型常量 | 1, 2, 3, 4 之类的常量,默认为10进制,可以8进制 0或16进制0x表示,默认以int存储。 | 
| 长整型常量 | 以 l或L结尾的整数,以long存储。 | 
| 无符号整型常量 | 以 u或U结尾的整型常量。 | 
| 浮点型常量 | 带小数点的数或以科学计数法表示的数,默认以 double存储,可带f/F或l/L后缀改变其存储形式。 | 
| 字符型常量 | 以单引号 '包括的单个字符,以char存储。 | 
| 字符串常量 | 以双引号 "包括的一串字符序列。 | 
| 枚举常量 | 整型常量值列表。 | 
字符常量
一个字符常量是一个整数,书写时将一个字符括在单引号中,如,‘x’。字符在机器字符集中的数值就是字符常量的值。字符常量一般用来与其他字符进行比较,但也可以像其他整数一样参与数值运算。
某些字符可以通过转义字符序列(例如换行符\n)表示为字符和字符串常量。转义字符序列看起来像两个字符,但只表示一个字符。另外,我们可以用\ooo表示 任意的字节大小的位模式 。其中,ooo代表1~3个八进制数字[0-7]。这种位模式还可以用\xhhh表示,其中,hh是一个或多个十六进制数字[0-9, a-f, A-F]。
ANSI C语言的转义字符:
| 转义字符 | 含义 | 
|---|---|
| \a | 响铃符 | 
| \b | 退格符 | 
| \f | 换页符 | 
| \n | 换行符 | 
| \r | 回车符 | 
| \t | 水平制表符 | 
| \v | 纵向制表符 | 
| \\ | 反斜杠 | 
| \? | 问号 | 
| \' | 单引号 | 
| \" | 双引号 | 
| \ooo | 八进制数 | 
| \xhh | 十六进制数 | 
| \0 | 空字符 | 
字符串常量
字符串常量也叫字符串字面量,是用双引号"括起来的0或多个字符组成的字符序列。
编译时,相邻的多个字符串常量会被自动拼接起来。
"hello,"        " world"
等价于:
"hello, world"
字符串常量就是字符数组。字符串内部使用一个空字符\0作为串的结尾,因此,存储字符串的物理存储单元数比括在双引号中的字符数多1个 。
C语言对字符串的长度没有限制,但程序必须扫描完整个字符串后才能确定字符串的长度。标准库函数strlen可以返回字符串参数的长度,长度不包括末尾的\0。
注意搞清楚字符常量与仅包含一个字符的字符串之间的区别:'x'与"x"是不同的。前者是一个整数,其值是字母x在机器字符集中对应的数值(内部表示值);后者是一个包含一个字符(即字母x)以及一个结束符\0的字符数组。
枚举常量
枚举是一个常量整型值的列表,例如:
enum boolean {TRUE, FALSE};
在没有显式说明的情况下,enum 类型中第一个枚举量的值为0,第二个为1,依此递增。如果只指定了部分枚举名的值,那么未指定的枚举名的值将依着最后一个指定值向后递增。
- 枚举中枚举量的名字必须互不相同。
- 但不同的名字的枚举量可以具有相同的值。
枚举常量与#define常量
枚举为建立常量值与名字之间的关联提供了一种便利的方式。
相对于#define常量来说,枚举常量的优势在于常量值可以自动生成。
可以声明enum类型的变量,但编译器不检查变量中存储的值是否为该枚举的有效值。
在调试程序可以以符号形式打印出枚举变量的值,这是枚举常量的优势之一。
const限定符
任何变量在声明时都可以用const限定符限定。该限定符表示变量的值不能被修改。对数组而言,const限定符指定数组所有元素的值都不能被修改。const限定符也可配合函数参数使用,表明该函数不修改传入变量的值。
- 在C中,以const限定的变量,仍可以通过特殊方法修改变量的值。
- 在C++中,const具有更加严格的限定性,可以放心当作常量使用。
试图修改const限定符限定的值,是未定义行为(undefined behavior)。