本节书摘来自华章出版社《C++程序设计教程(第3版)》一书中的第2章,第2.3节常量和变量,作者张志航,更多章节内容可以访问云栖社区“华章计算机”公众号查看
2.3 常量和变量
2.3.1 常量
在程序的运行过程中,其值不变的量称为常量。编程者可以直接在程序中书写常量。如在例1.2中有常量3和5。下面对各种类型的常量及其书写形式做详细介绍。
1.整型常量
1)十进制整型常量,如123、-456。
2)八进制整型常量,如0123、-016。
八进制整型常量以0(零)开头,在数值中可以出现数字符号0~7。
3)十六进制整型常量,如0x123、-0xAB。
十六进制整型常量以0x(零x)或0X开头,在数值中可以出现数字符号0~9、A~F(或小写的a~f)。
4)长整型与无符号型整型常量。
长整型常量,如12L、0234L、-0xABL、12l、0234l、-0xABl。
无符号型整型常量,如12U、0234U、0xABU、12u、0234u、0xABu。
在一个整型常量后加后缀L或l(小写的L)表示该常量是长整型常量;在一个整型常量后加U或u(小写的U)表示该常量是无符号型整型常量。
在程序中书写的整型量,只要它的数值范围在int型量的范围内,则它的默认数据类型是int型,而不是char型、short型或long型,如常量439是int型常量。
2.逻辑型常量
逻辑型常量只有两个,即true和false,分别代表逻辑“真”和逻辑“假”。
3.实型常量
实型常量在内存中以浮点形式存放,均为十进制数,无数制区分。两种书写形式如下所示。
1)小数形式:必须写出小数点,如1.65、1.、.123均是合法的实型常量。
2)指数形式:也称为科学表示法形式,如实型常量1.23×105和1.23×10-5在程序中可以书写成1.23e5和1.23e-5。e或E前必须有数字,e或E后必须是整型量。例如,1000应写成1e3,而不能写成e3。
在程序中书写的实型量,它的默认数据类型是double,而不是float,如1.23是double型量。如果想把一个实型常量表示成float型常量,可加后缀F或f,因此1.23e5F、1.23e5f、1.23F和1.23f均表示float型常量。
4.字符型常量
用单引号括起来的一个字符称为字符型常量,如在程序中书写的'a'、'A'、'?'和'#'分别表示4个字符,在内存中对应存放的是该4个字符的ASCII码值,其数据类型为char型。用这种方式只能表示键盘上的可输入字符,而ASCII码表(见附录A)中的一些控制字符无法用这种方式表示。例如,ASCII码值为10的字符是控制字符,表示换行,无法用上述简单方式表示。为此,C++提供了另外一种表示字符型常量的方法,即“转义”字符。转义字符是以反斜杠“”引导的特殊的字符型常量表示形式。一般地,'n'表示字母n,而'n'表示一个控制字符“换行”,跟随在“”后的字母n的意义发生了转变,所以叫作转义字符。在表2-3中列出了C++中预定义的转义字符。
表2-3 C++中预定义的转义字符
表2-3中倒数第2、3行是转义字符的高级形式,它可以表示任一字符。例如,'n'表示控制字符“换行”,它的ASCII码是十进制数10,10的八进制和十六进制表示分别是12和a,因此'n'也可以表示成'12'、'xa'或'xA'。又如字母A的ASCII码是十进制数65,它的八进制和十六进制表示分别是101和41,所以在程序中,字母A可以表示成'A'、'101'或'x41'。特别注意表的最后一行,'0'是'ddd'的具体表示,其ASCII码值是0,它表示空字符,经常被用作字符串结尾标志。
5.字符串常量
字符串常量是用双引号括起来的字符序列,如"CHINA"、"How do you do."和"a"。字符串常量在内存中的存放形式是存储其连续字符的ASCII码值,末尾加一个特殊字符'0',作为结尾标志,其意义见表2-3的最后一行。例如,字符串"CHINA"在内存中的存储形式如图2-2所示。
注意:字符常量'a'和字符串常量"a"是不同的。字符常量'a'在内存中占用1字节,而字符串常量"a"在内存中占用2字节,如图2-3所示。
2.3.2 符号常量
编程者可以在程序中直接书写常量,但有时会遇到一些麻烦。例如,在进行数学计算时,程序中要多次使用π,则需要多次书写3.141 592 6,这样输入程序时可能出现将数字输入错误的情况。另外,计算时如果π的精度需要变化,如将3.141 592 6改为3.14,就需要在程序中进行多处修改。
C++提供了一种机制以避免上述麻烦。用一个标识符代表一个常量,称为符号常量。编程者可以在程序的开头定义一个符号常量,令其代表一个值,在后续程序中可使用该符号常量。
符号常量的定义形式为:
define PRICE 30
define PI 3.1415926
define S "China"
此3行代码定义了3个符号常量,它们是PRICE、PI和S。定义符号常量的好处是,如果在程序中多处使用了同一个常量,当需要对该常量修改时,只需要在定义处修改一处即可,而不需要修改程序中的多处。给符号常量取有意义的名字有利于提高程序的可读性,另外,一般使用大写字母给符号常量命名。
下面用一个例子说明符号常量的使用。
例2.1 符号常量的使用。
`include
using namespace std;
define PI 3.14159
int main(void)
{
float r, c, a, sa;
r = 5.0f; // 给半径赋值,5.0f是float型常量
c = 2 * PI * r; // 计算圆周长
a = PI * r * r; // 计算圆面积
sa = 4 * PI * r * r; // 计算球表面积
cout << "PI = " << PI << '\n'; // A
cout << "c = " << c << '\n';
cout << "a = " << a << '\n';
cout << "sa = " << sa << '\n';
return 0;
}`
程序中A行字符串"PI="中的PI是字符串常量的一部分,不是独立的符号常量。
2.3.3 变量
在程序的运行过程中,其值可变的量称为变量。一个变量有3个要素,即变量名、变量的存储空间和变量的值。变量名必须用标识符来标识。变量根据其取值范围的不同可分为不同类型的变量,如字符型变量、整型变量、实型变量等,因此不同类型的变量的存储空间也不同。
1.变量定义
变量定义的一般格式为:
[<存储类别>] <变量类型> <变量名1>,<变量名2>,…,<变量名n >
这里不必关心变量的<存储类别>,在后续有关章节中有详细说明。定义变量的例子如下:
int a, b; // 定义2个整型变量a、b
unsigned u; // 定义1个无符号整型变量u
float f; // 定义1个单精度实型变量f
double d; // 定义1个双精度实型变量d
char c1, c2, c3; // 定义3个字符型变量c1、c2、c3
变量必须先定义后使用,原因为:
1)变量定义指定变量的类型,编译器根据类型给变量分配存储空间,并建立变量名与其存储空间的对应关系,程序中通过变量名给变量的存储空间赋值或读取该存储空间中的值,这一过程称为变量的存取。
2)C++中某些运算对参加运算的数据类型有限制,变量具有类型后,便于编译器对运算的合法性做检查。
2.变量赋初值
当使用变量时,变量必须有值,给变量赋初值的方法有两种,如下所示。
1)变量定义后,用赋值语句赋初值。例如:
int a, b;
a = 12; b = -24;
char c1, c2;
c1 = 'A'; c2 = 'B';
此处“=”是赋值运算符,表示将赋值号右边的值存入赋值号左边的变量对应的存储空间中。
2)在定义变量的同时直接赋初值(称为变量的初始化)。例如:
int a = 12, b = -24;
char c1 = 'A', c2 = 'B';
3.常变量
变量的值可以随时变化,即按需要给变量重新赋值。但有时为了保护变量的值,不允许对变量做修改,则需要将变量说明成常变量,具体方法是在变量定义语句前加说明符const。例如:
const float pi = 3.14;
常变量定义时必须初始化。具体应用见函数形式参数等相关内容。