常量
常量,顾名思义,就是在程序运行期间,固定不变的量,这些固定的值,又被称做字面量。
常量可以是任何的基本数据类型,包括整型数字、浮点数字、字符、字符串和布尔值。
程序运行期间,内存中有一块不可写区域用来存放常量。
常量分类
常量 | 说明 |
---|---|
整型常量 | 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)。