在程序运行中,其值不能被改变的量称之为常量。在基本数据类型中常量分为整型常量、实型常量、符号常量和字符型常量(含字符常量和字符串常量)。
· 整型常量即为整型常数,可用十进制、八进制和十六进制3种形式表示。
· 十进制整型常量由0~9的数字组成,没有前缀,不能以0开始,没有小数部分。如:-123、0、456等。
· 八进制整型常量以0为前缀,其后由0~7的数字组成,没有小数部分。如:0123(等于十进制数的83),047(等于十进制数的39)。
· 十六进制整型常量以0x或0X为前缀,其后由0~9的数字和A~F(大小写均可)的字母组成,没有小数部分。如:0x123(等于十进制数的291),0X7A(等于十进制数的122)。
整型常量中的长整型数据可用L(或小写字母l)作为后缀来表示。如:1234L、5678l等。
整型常量中的无符号型数据可用U(或u)作为后缀来表示。如:1234U、5678u等。如果一个整型常量的后缀是U(或u)和L(或l),或者是L和U,都表示为unsigned long类型的常量。如:12345UL、67890ul等。
实型常量是由整数部分和小数部分组成的,它只有十进制的两种表示形式。
(1)定点数形式。它由数字和小数点组成。整数和小数部分可以省去一个,但不可两者都省,而且小数点不能省。如:1.234、.123、123.、0.0等。
(2)指数形式(或称科学表示法)。它是在定点数形式表示法后加e(或E)和数字来表示指数的。指数部分可正可负,但须为整数,且应注意字母e(或E)之前必须有数字。如:1.234e3、12.34e2均合法地代表了1.234×103;而e3、1e2.3、.e3、e均不合法。另外,实型常量的后缀用F(或f)表示单精度型,而后缀用L(或l)表示长双精度型。如:0.5e2f表示单精度数,3.6e5L表示长双精度数。
在程序中,可以定义一个符号来代表一个常量,这种相应的符号称为符号常量。例如,用PI代表圆周率π,即3.1415926。使用符号常量有以下好处。一是增加可读性。在程序中出现具有一定意义的符号常量时,一看便能帮助读者了解其含义,即见名知义,如PI代表π、NAME代表姓名等。二是提高了可维护性。使用符号常量可使修改该常量变得更加方便。如在程序中直接使用某个常量,且该常量在程序中多处出现,若需修改该常量时,则需在每处出现该常量的地方都要加以修改,容易漏改或改错。其三,使用符号常量,则只要修改其定义处即可,即一改全改。如程序中出现某职工的姓名,且多处需要用此姓名,若用NAME符号常量代表姓名,一旦需要改变姓名,只要修改NAME的定义处即可。
在C语言中,是用预编译处理命令#define来定义符号常量。如:
#define PI 3.1415926
#define NAME "姚木兰"
这种语句的格式是在#define后面跟一个标识符和一串字符,彼此之间用空格隔开。由于它不是C语句,故语句末不用分号(;)。当程序被编译时,它先被编译预处理。即预处理遇到#define时,就用标识符后的字符串替换程序中的所有该标识符。
习惯上,符号常量标识符用大写字母写出,以示与变量名区别。另外,符号常量标识符一旦定义,就不能在其他地方给该标识符再赋值。如,PI=3.14;是错误的。
字符型常量包含字符常量和字符串常量两类。
用一对单引号括起来的一个字符称为字符常量,例如:'a'、'A'、'3'、'?'等。它的实际含义是该字符在内存中的编码值,常用的是以ASCII编码来表示字符,如:'a'的编码值是97,'A'的编码值是65,'3'的编码值是51而不是数值3。
除了以上形式的字符常量外,C还允许使用一种特殊形式的字符常量,即以反斜杠符(\)开头,后跟字符的字符序列,称之为转义字符常量,用它来表示控制及不可见的字符(表2-2),它同样表示的是该转义字符的ASCII码值,如,\n表示换行,其ASCII码值为10;\a表示响铃,其ASCII码值为7等。
表2-2 常用转义字符
转义字符 |
意 义 |
ASCII码 |
转义字符 |
意 义 |
ASCII码 |
\a |
响铃 |
0x07 |
\f |
换页(走纸) |
0x0c |
\n |
换行 |
0x0a |
\0 |
空字符 |
0x00 |
\t |
横向跳格 |
0x09 |
\\ |
反斜杠 |
0x5c |
\v |
竖向跳格 |
0x0b |
\' |
单引号 |
0x27 |
\b |
退格(Backspace) |
0x08 |
\" |
双引号 |
0x22 |
\r |
回车 |
0x0d |
\ddd |
1~3位八进制数所代表的字符 |
对应字符的ASCII |
转义字符\ddd(为八进制数字,0~7之一)将字符的ASCII码值转换为对应的字符,它表示任一个字符。例如,'\101'表示字符'A','\012'表示转义字符'\n','\0'或'\000'表示ASCII码为0的控制字符,即“空”字符。
字符串常量是用一对双引号("")括起来的零个或多个字符的序列,例如:
"This is a string"
"5401349"
"$10000.00"
" " /*引号中有一个空格,本书中用' '表示一个空格*/
"" /*引号中什么也没有*/
"\a" /*引号中有一个转义字符*/
字符串常量在内存中存储时,系统自动在每个字符串常量的尾部加一个“字符串结束标志”字符'\0'。长度为n个字符的字符串常量,在内存中要占用n+1个字节的空间。
例如,"hello"在内存中的形式是:
104 |
101 |
108 |
108 |
111 |
\0 |
为了能直观理解,以后表示字符串时,直接用字符本身表示。上例表示成:
h |
e |
l |
l |
o |
\0 |
【程序2-2】分析下列程序的运行结果。
/* 文件名:chap02_2.cpp */
#include <stdio.h>
#include <string.h>
void main(){
char *cstr="China\a\n\101\t\\";
printf("%d\n",strlen(cstr));
printf("%s\n",cstr);
}
程序运行结果:
10
China
A \
程序中"China\a\n\101\t\\"是一个符号常量,由字符指针cstr指向它(有关字符指针的内容在后续章节中介绍)。该符号常量似乎有17个字符,事实上,它只有10个字符,分别是C、h、i、n、a、\a、\n、\101(对应字符'A')、\t和\,其中有5个转义字符。
字符常量A('A')与字符串常量A("A")的区别:
· 定界符不同。字符常量使用单引号,而字符串常量使用双引号。
· 长度不同。字符常量的长度固定为1,而字符串常量的长度可以是0,也可以是某个整数。
· 存储要求不同。字符常量存储的是字符的ASCII码值,而字符串常量除了要存储有效的字符外,还要存储一个结束标志\0。
在C语言中,没有专门的字符串变量,字符串常量如果需要存储在变量中,要用字符数组来解决。详细内容将在后续章节中介绍。