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)使用符号常量的好处是:含义清楚,能做到“一改全改”。