C语言程序设计案例精粹
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 常量

在程序执行过程中,其值不发生改变的量称为常量。常量与数据类型结合又可分为整型常量、浮点常量、字符常量和枚举常量。在程序中,常量可以不经说明直接引用。

例如,有如下语句:

i = 10;

该语句为赋值语句,表示将整型常量10赋给变量i。其中数字10即为整型常量,属于正确引用,但由于变量i未经定义就进行引用,程序编译将会出现错误。

2.3.1 整型常量

常用的整型常量有八进制、十进制和十六进制3种。

1. 八进制常量

八进制常量必须以数字0开头,数码取值为0~7。八进制数通常是无符号数,以下均是合法的八进制数:022,0110,0177777等。以下均是不合法的八进制数:123(无前缀0),0492(含有非八进制数码),-0127(出现了负号)等。

2. 十六进制常量

十六进制常量必须以0X或0x开头。其数码取值为0~9,A~F或a~f。以下均是合法的十六进制数:0XB5,0X10,0XFFFF等。以下均是不合法的十六进制数:B6(无前缀0X),0X3G(含有非十六进制数码)等。

3. 十进制常量

十进制常量没有前缀。其数码取值为0~9。以下均是合法的十进制数:23,-70,65535,1024等。以下均是不合法的十进制数:023(不能有前缀0),23D(含有非十进制数码)等。

不同进制的数可以同一种格式输出,也可以不同格式输出,范例2.13说明了不同进制常量的数值表示。

范例2.13 OutputInteger.c

OutputInteger.c:整型常量中八进制、十进制和十六进制的输出格式分别为:%o,%d和%x,使用不同的格式,输出结果就是对应的表示形式,例如输出整数521,0521和0x521的几种表示方法。(光盘\chat2\ OutputInteger.c)

          01   #include<stdio.h>                            //头文件包含
          02   main()
          03   {
          04       printf("%-4o,%-4o,%-4o\n",521,0521,0x521);  //八进制输出
          05       printf("%-4d,%-4d,%-4d\n",521,0521,0x521);  //十进制输出
          06       printf("%-4x,%-4x,%-4x\n",521,0521,0x521);  //十六进制输出
          07   }

上述代码4,5,6行分别按八进制、十进制和十六进制输出三个不同的整型常量521,0521和0x521。输出结果为:

      1011  521  2441
      521   337  1313
      209   151  521

作者心得:

C语言中,整型常量可用后缀加字母l或L表示长整型,如034L表示长整型八进制数034。32位机中,长整型和普通整型没有区别。

2.3.2 实型常量

实型也称为浮点型。C语言中,实型常量也称为实数或者浮点数,并且,实型常量只采用十进制数表示形式。实型常量的表达方式有两种:小数形式与指数形式。

1. 小数形式

实数的小数形式由数字0~9以及小数点组成。其中,小数点前仅有零位时,数字0可省略,小数点后仅有0位时,数字0也可以省略。例如0.391、14.0、.556、-33.等均为合法的实数。

2. 指数形式

实数的指数形式由十进制数码、阶码标志e或E以及阶码组成,其中阶码包括阶符和阶数两部分,阶符可为+或-,其中+可省略,阶数只能是十进制正整数或零,阶码不能省略。指数形式的一般表达方式为:a E n,其中,a为十进制数,n为阶码,如+5、-6及+9等均为阶码。

如实数314159.26可表示为:3.1415926E+5、3.1415926e5或314.15926E+3等。其中,把3.1415926E+5这种形式称为“规范化的指数形式”,即十进制数码绝对值为大于1小于10的数。

实型常量可通过加后缀f或F表示,如58f和785F分别表示实型常量58和785,其内存所占空间与整型常量58和785有所不同。

2.3.3 字符常量

字符常量是C语言程序中应用非常广泛的一类常量,通常它是用单引号引起来的一个字符,字符常量在内存中占一个字节的内存空间。

1. 普通字符

例如'm','n','@','+','?'都是合法字符常量。在C语言中,字符常量有以下特点。

(1)字符常量只能用单引号引起来,不能用双引号或其他括号。

(2)字符常量只能是单个字符,不能是字符串。

(3)字符可以是字符集中的任意字符。但数字被定义为字符型之后就不能以原数值参与数值运算,如'0'和0是不同的。'0'是字符常量,但它仍能参与运算,不同的是需要将其转化为对应的ASCII码值48。

例如下面的代码:

      01  #include<stdio.h>                  //头文件包含
      02  main()
      03  {
      04     printf("%d,%d\n",0,'0');           //格式输出
      05  }

程序输出结果为:

      0,48

说明以整型格式输出时,字符'0'将以其ASCII码值48输出。

2. ASCII码

ASCII码(American Standard Code for Information Interchange):美国国家信息交换标准码。ASCII码使用一个字节表示不同的字符,最多可以定义256个字符,目前已定义128个,其中包括字母、数字、标点符号、控制字符及其他特殊符号的数值。它是国际标准化组织ISO(International Organization for Standardization)批准的国际标准码。

ASCII字符集共有128个字符,其中96个可打印字符,包括常用的字母、数字、标点符号等,其他32个为控制字符。ASCII字符集及其编码见附录A。

C语言中常用的ASCII码是字母和数字集合,如A的ASCII值为65,a的ASCII值为97。

3. 转义字符

转义字符是一种特殊的字符常量。转义字符以反斜杠'\'开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称转义字符。例如,在hello程序中printf函数中用到的'\n'就是一个表示换行的转义字符。常用的转义字符及其含义如表2-3所示。

表2-3 转义字符表

转义字符中最常用的是换行符'\n',在很多输出语句中将使用它进行打印换行。

2.3.4 字符串常量

C语言中,字符串常量是由一对双引号引起来的字符序列。每个字符串都以’\0’作为结束标志。字符串常量在内存中存储时,系统在字符串的末尾自动添加字符串结束符’\0'。因此,在C语言程序中,n个字符的字符串常量在内存中占有n+1个字节的存储空间。

例如,字符串"Hello"包含5个字符,而在内存中占6个字符,系统在字符串结尾会添加结束符'\0'。需要特别注意的是,范例2.14说明了单个字符和字符串的区别。

范例2.14 Charstringdifferent.c

Charstringdifferent.c这里通过sizeof运算符解释字符常量和字符串常量在内存中所占字节数的差别。(光盘\chat2\Charstringdifferent.c)

          01   #include<stdio.h>           //头文件包含
          02   main()
          03   {
          04       printf("char数据类型长度:%d\n",sizeof((char)'a'));//格式输出
          05       printf("string数据类型长度:%d\n",sizeof("a"));
          06   }

sizeof是C语言中用于获取对象内存字节数的特殊运算符。这里分别获取了字符'a'和字符串"a"在内存中所占字节数。程序第4行和第5行分别通过sizeof运算符获取字符'a'和字符串"a"的内存字节数。在获取字符所占内存空间时使用了强制类型转换,原因请查看疑难解决2。程序运行输出结果为:

char数据类型长度:1

string数据类型长度:2

字符'a'和字符串"a"在内存中的逻辑存储如图2-2所示。

图2-2 字符'a'和字符串"a"在内存中的逻辑存储

作者心得:

范例2.14代码中printf函数内的说明字符串"char数据类型长度:" 和 "string数据类型长度:"都使用了中文作为说明字符串。在Visual C++6.0编程环境中,应尽量避免使用中文字符串,尽量使用英文和拼音来表达。本书为便于读者理解,均使用了中文,读者在实际编写程序时应尽量避免这类情况。