4.4 常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。常量可以是任何的基本数据类型(比如整数常量、浮点常量、字符常量)或字符串字面值,也有枚举常量。常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
4.4.1 整数常量
整数常量可以是十进制、八进制或十六进制的常量。整数常量的前缀指定基数:0x或0X表示十六进制,0表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀通常是U和L的组合,其中U表示无符号整数(unsigned),L表示长整数(long)。
下面列举几个整数常量的实例:
456 // 合法的 215u // 合法的 0xFeeL // 合法的 078 // 非法的:8不是八进制的数字 032UU // 非法的:不能重复后缀
1.八进制整数常量
在C语言中,八进制整数常量通常在常数前加0进行修饰,并且八进制数需为0~7组成,例如:
a=0123; b=0765;
2.十进制整数常量
在C语言中,十进制整数常量由0~9数字组成,不需要添加任何前缀。例如:
c=123; d=798;
3.十六进制整数常量
在C语言中,十六进制整数常量使用0x或者0X作为前缀,并且包含数字0~9以及字母A~F。例如:
e=0x123; f=0X78a9;
提示
十六进制整数常量的表示中字母A~F可以为大写,也可以为小写。
4.无符号整数常量
在C语言中,无符号整数常量使用u或U作为后缀。例如:
g=123u; h=789U;
5.长整数
在C语言中,长整数通常使用l或L作为后缀。例如:
i=123l; j=789L;
提示
在C语言中长整数和无符号整数常量的后缀可以是大写,也可以是小写,并且U和L的顺序任意。
6.实型常量
C语言中的实数又称浮点数,有两种表示形式:
(1)小数形式
当使用小数形式表示浮点常量时,必须包含整数部分、小数部分,或同时包含两者。例如:
R=6.0; PI=3.14; c=0.618;
(2)指数形式
当使用指数形式表示浮点常量时,必须包含小数点、指数,或同时包含两者,并且指数是用e或E来引入的。例如:
a=123e3; b=123.4E2;
下面是一些合法和不合法的实数表示:
c=0.3E; d=0.2e0.23; f=e-5;
提示
指数形式后缀不区分大小写。E后面必须是整数,E前面必须要有数字。
【例4-7】编写程序,通过printf()输出整数常量。(源代码\ch04\4-7)
运行上述程序,结果如图4-19所示。
图4-19 整数常量
【代码解析】
本例用于演示常量的输出形式。第4行代码输出一个正整数123,第5行输出正实数45.31,第6行输出负整数-78,第7行输出负实数-12.8975,这些都是整数常量。
4.4.2 字符常量
字符常量是用单引号括起来的一个字符。有两种表示方法:一种是用该字符的图形符号,如'b''y' '*',另外还可以用字符的ASCII码表示,即用反斜符(\)开头,后跟字符的ASCII码,这种方法也称为转义序列表示法,如“\n”“\t”等。
1.字符常量
使用单撇号(' ')括起一个字符的书写形式即称为字符常量。书写字符常量时需注意以下几点:
(1)字符常量是区分大小写的,如'a'与'A'是两个字符常量。
(2)字符常量中只能包括一个字符,不能是字符串,如'aa'是错误的。
(3)字符常量只能使用单撇号括起来,不能使用单引号或其他括号。
(4)单撇号只是界限符,不属于字符常量中旳一部分,字符常量只能是一个字符,是不包含单撇号在内的。
(5)单撇号里面可以是数字、字母等C语言字符集中除'和\以外的单个字符,但是数字被定义为字符之后则不能参与数值的各种运算。
2.转义字符
转义字符通常由反斜杠“\”加上一个字符或者一个代码值来表示,其含义是将反斜杠后的字符转换为其他意义。
转义序列表示法还可以用来表示一些特殊字符,用来显示特殊符号或控制输出格式,通常有两种表示形式:
(1)使用字符的八进制ASCII码,如“\0dd”,其中“0dd”为八进制。
(2)使用字符的十六进制ASCII码,如“\xhh”“\Xhh”等,其中“hh”为十六进制值。
常用的转义字符以及含义如表4-4所示。
表4-4 常用转义字符以及含义
提示
在C语言中,3和'3'的含义是不一样的:一个是数值,可运算,一个是字符,一个符号而已。而'a'和'A'同样也是不一样的,字符区分大小写。
【例4-8】编写程序,要求在一行中输出字符b、Y、空格、问号,然后换行再输出单引号,换行符。(源代码\ch04\4-8)
#include<stdio.h> int main() { printf("b,Y,\x20,\?,\n"); // 输出字符b,Y,空格,?,换行符 printf("\'\n"); // 输出单引号,换行符 return 0; }
运行上述程序,结果如图4-20所示。
图4-20 字符常量
【代码解析】
本例演示了如何输出字符常量与转义字符,如'b'、'Y'、“\x20”以及“\'”等。“printf("b,Y,\x20,\?,\n");”表示输出小写字母“b”,大写字母“Y”,接着是一个转义字符,表示为空格“ ”,然后是问号“?”,接着是转义字符“\n”表示换行,在新的一行首先输出单引号“'”,然后换行。
4.4.3 字符串常量
字符常量是一个字符,字符串常量是一对双引号(“ ”)括起来的字符序列。例如:
"How do you do !" "$123.45"
为字符串分配若干个字符,每一个字符占用一个字节,如图4-21所示。
图4-21 字符串内存分布
(1)字符常量与字符串常量的区别
“a”与‘a’的区别:“a”分配2个字节,存放‘a’和字符串结束符‘\0’,而‘a’只分配1个字节,如图4-22所示。
图4-22 字符常量与字符串常量的区别
(2)字符串常量不能赋给一个字符变量。例如:
c = "a"; // 错误操作
提示
C语言中的字符串可以用字符型数组来存放。不要混淆字符常量与字符串常量。
4.4.4 符号常量
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。在程序中定义过得符号常量不可被寻址,不可更改赋值,它属于指令的一部分。
提示
符号常量在使用之前必须先定义。
符号常量的一般形式为:
#define 标识符 常量
其中#define也是一条预处理命令(预处理命令都以“#”开头),称为宏定义命令(在后面预处理程序中将进一步介绍),其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。
习惯上符号常量的标识符用大写字母表示,变量标识符用小写字母表示,以示区别。
提示
符号常量一经定义,以后在程序中所有出现该符号常量标识符的地方均代之以该常量值。
【例4-9】编写程序,要求使用符号常量进行算数运算。(源代码\ch04\4-9)
#include<stdio.h> #define P 5 //定义符号常量P int main() { int num,total; num=6; total=num* P; printf("total=%d\n",total); return 0; }
运行上述程序,结果如图4-23所示。
图4-23 符号常量
【代码解析】
本例演示了在代码中运用符号常量。通过#define定义一个字符常量P,在主函数中定义两个变量num和total,并给num赋值,然后通过公式计算出变量total的值。
注意:
(1)用标识符代表一个常量,称为符号常量。
(2)符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。
(3)使用符号常量的好处是:含义清楚,能做到“一改全改”。