本节书摘来自华章社区《C语言程序设计:问题与求解方法》一书中的第2章,第2.9节常量,作者:何 勤,更多章节内容可以访问云栖社区“华章社区”公众号查看
2.9 常量
C语言源程序中,可以使用的运算量有两大类:常量和变量。在程序运行过程中,其值不能被改变的量称为常量。
C语言中常量又分为数值常量和符号常量两大类。程序中应当多使用含义比较清楚的符号常量,尽量不要用意义不太明确的数值常量。
2.9.1 数值常量
在C语言源程序中,数值常量可以直接使用,数值常量的书写规则与我们在日常工作中书写常量的规则很类似但又有些区别。必须严格按照C语言的规范要求来书写,否则,编译程序将无法识别,不能将其转换成机器指令能够处理的二进制机内形式的常量。
常用的数值常量有以下几种:
1)十进制整型常量 : 567、–425 、0 等, 这是没有小数分量的整数值。可以带有正负号,但正号可以省略不写。
注意:一个整型常量的各个数字之间不能出现空格或逗号(例如,12345 既不能写成12,345也不能写成12 345)。除了整数值0以外,其他任何整数值不能以0开头(比如,0761会被编译程序当作八进制整数,参见第3章)。
整型常量的其他表示形式请参见下一章。
2)实型(或称为浮点型)常量。实型常量在源程序中的两种书写形式是:
十进制小数形式:由正负号、数字、小数点构成。0.543、.543、543.、543.21、0.0 都是十进制的小数形式。在数的左边还可以加上正负号。比如–543.0。小数点的两边至少有一边要有数字。
指数形式:绝对值太小或太大的实型常量,用小数形式表示很不方便,可以用指数形式表示。比如,数学中的7.16×1015 在C语言中要用7.16E+15 表示;数学中的–3.456×10–11在C语言中要用–3.456e–11 表示。
注意:一个数值的指数表示形式并不是唯一的。比如,54.3e–2和5.43e–1都等于0.543,也就是说表示同一个实数时,该数的小数点是可以“浮动”的。这是浮点数名称的由来。
小数点前面只保留一位非零数字的指数形式,称为规范化的指数形式。
提示:指数形式浮点数的书写规则
字母e(或者E)之前和之后都必须有数字,这些数字之前都可以带有正负号。
e(或者E)之后的指数必须是一个整数值。
在字母e(或者E)的前后以及数字之间不得插入空格。
注意,在C语言源程序中不能使用二进制常量。
3)字符常量:用一对单引号括起来的英文常用字符集(英文常用字符集对于绝大多数当代计算机来说,就是ASCII字符集)中的单个字符,称为字符常量,例如'a'、'*'、'8'、' '(这是一个空格字符)等。
在程序的正文部分书写字符常量时,都必须用单引号括住,以便与单个字符的标识符或运算符区别开来。比如在源程序正文部分,a 是标识符,+ 是加法运算符,然而,用单引号括住的'a' 和'+'都是字符常量。但是在输入或输出字符常量时,都不用单引号括住。
在C语言中,可以使用转义字符'n'表示“回车换行”字符,本章后面将对转义字符进一步说明。
字符常量是用计算机进行文字处理的基础。
4)字符串常量:由用双引号括起来的连续多个字符组成,如“567”、“hello”等。
我们在程序中看到的字符串常量,其实在内存中,通常只不过是在多个连续的字节中存放的一串二进制的ASCII码而已。
注意:“h”是字符串常量而不是字符常量。
2.9.2 符号常量
前面所讲的都是数值常量(C语言中字符常量也是数值常量中的一种)。而符号常量是用符号在源程序中表示一个数值常量。符号常量一般由大写英文字符组成的标识符构成,用编译预处理命令#define将符号常量与某个数值常量关联起来。 比如:
#define PI 3.14
这样一来,在进行编译之前,源程序中所有出现的符号常量PI都会被编译预处理程序用 3.14 替换掉。
使用符号常量会使得修改常量的值变得非常方便。对于上例,只要将 #define PI 3.14 修改为#define PI 3.1416 ,则源程序中多处出现的PI便都会被编译预处理程序替换成 3.1416,程序的可读性也更好。
对于字符常量和整型常量,也都可以用符号常量来表示,比如:
#define ADD '+'
#define days 31
2.9.3 数据的机内形式和机外形式
源程序中(或输入输出时),常量(或变量)值的形式(比如十进制形式)称为数据的机外形式;而计算机内部存储(和传输)的二进制数据形式称为数据的机内形式。一个机内形式的数据常常可以表示为多种等值的机外形式的数据。
我们在编写C语言源程序和运行程序输入数据时,只能使用数据的机外形式,不能使用二进制数据。将机外形式数据转换成机内形式数据是由系统(编译程序、输入输出库函数等)自动进行的。但是在遇到了一些疑难编程问题(溢出、类型转换或进行嵌入式编程和系统编程)时,往往需要了解和掌握数据的机内形式,才能找到较好的解决方案。
延伸与拓展:数据的机内存储形式
整型量在计算机内部的存储方式
整型量在计算机内部的存储方式有两类:无符号整型和有符号整型。无符号整型就是用一定长度的二进制位串直接表示的非负整数。有符号整型就是用一定长度的二进制位串作为编码,来间接表示一个有符号整数。通常用最高位表示数的符号,最高位为0表示正数,最高位为1表示负数。在绝大多数计算机中,使用补码来表示有符号整数。
实型量在计算机内部的存储方式
在计算机内部,实型量的存储方式与整型量的存储方式全然不同。它们通常是以规范化的指数形式来存储的(即小数点前面只有一位非负整数的指数形式,在二进制中,这个非负整数必定是1)。一般是用内存中地址连续的几个字节(比如4个字节一共32位)中的最高位表示数的正负号、若干位表示数的指数部分、若干位表示数的小数部分(即除去一位非零整数部分后的小数部分),见下表。
符号位(占1位) 指数部分(若干位) 小数部分(若干位)
指数部分的符号通常隐含在指数部分的数据位串中,这是由于指数部分通常采用余码表示法,进一步的讨论请参见第3章。
【过关测试】指出例题2.2中,哪些是程序的正文部分?哪些是关键字?哪些是标识符?哪些是数值常量?哪些是符号常量?