2.2 变量
与上一节介绍的常量只能存储不变的数据不同,变量用于存储一个可变数据,该数据的值可在应用程序中随时改变。在实际的应用程序中,变量的使用远多于常量,这是因为变量的使用更为灵活,且符合人们的思维习惯。
2.2.1 声明变量
一般来说,变量可以用来存储程序中需要处理的数据。在使用变量前,需要使用声明语句对变量进行声明。C++中变量说明语句的一般形式为
[<存储类> ] <类型名或类型定义> <变量名表>;
其中,存储类指的是变量的存储位置,一般来说有如下4种类型。
● auto:属于一次性存储,其存储空间可被若干变量多次覆盖使用。
● register:存放在通用寄存器中。
● extern:在所有函数和程序段中都可引用。
● static:在内存中是以固定地址存放的,在整个程序运行期间都有效。
其中,[<存储类> ]的方括号表示可以缺省,在默认情况下,变量的存储类值为auto。读者可以根据不同需要声明不同的存储类变量,这在后续章节中还将提到。
类型名或类型定义指的是变量所属的数据类型,一般来说,指的是前面章节介绍的基本数据类型和枚举类型等。在任何变量说明语句中,数据类型定义不可缺省。
变量名表是指声明变量的变量名称,此外,在变量的声明语句中,可以对该变量赋初值。变量名表的格式主要有如下三种:
● <变量名>
● <变量名>=<表达式>
● <变量名1>=[<表达式1>], <变量名2>=[<表达式2>], …
其中,表达式是指变量的初始化值。例如,下面程序代码定义了几个变量。读者可参照注释仔细理解变量的声明方法,尤其是一条语句种声明多个变量的方法。如以下代码所示:
int a; //声明整型变量a char b=’A’; //声明字符型变量b,并给其赋初值字符A float c=2.5,d,e=56.1; //声明浮点型变量c,d,e,其中将c赋初值2.5,e赋初值56.1
上述三条语句中,定义了5个变量,其中前两条语句各声明了一个变量,后一条语句声明了三个变量,并给其中的c和e赋了初值,这在应用程序中都是常见的声明方式。
2.2.2 变量的命名规则
C++中,变量的命名规则与其他高级语言的类似,读者如果有过高级语言诸如C语言等的学习经历,可以与之进行比较。
在C++中,变量是一种标识符,其命名规则必须遵循标识符的命名规则,即变量只能由大小写英文字母、下画线(_),以及阿拉伯数字组成,并且其第一个字符必须是大小写英文字母或者下画线,而不能是数字。例如,下列变量名为合法变量:student、name2、s_age、_sno等,而如下的这些变量名为非法变量:
student$,studen]t,studen* //$、] 和 * 都是非法字符 2name //不能以数字开头 s-age //- 是非法字符
一般来说,操作系统和C++标准库里的标识符以下画线开头,这是约定俗成的。用户应该避免使用下画线作为自己定义的标识符的开头。此外,不能用关键字和保留标识符来给自定义的变量命名。
注意:C++语言是大小写敏感的语言,也就是说,star、Star、sTar、stAr和STAR等都是相互不同的标识符。
事实上,变量的命名除了需要满足以上的命名规则外,为了保证程序的可读性,还需要对其进行一些约束。这是因为如果变量的命名毫无规律的话,那么程序员之间就不能看懂对方的代码写的是什么,在大型软件系统开发中,这将极大地影响开发效率。可见,好的命名规则意味着程序代码的易读性和高质量。
目前在Windows程序开发和MFC程序开发中常用的命名规则是匈牙利命名法。这种命名法的出发点是把变量名按“前缀+对象描述”的顺序组合起来,以使程序员命名变量时对变量的类型和其他属性有直观的了解,所有Microsoft的API、界面、技术文件等都采用这些规范。应用匈牙利命名法,所有的变量名都应该以“前缀+名字”的形式出现,如表2-1所示给出了匈牙利命名法使用的前缀符号。
表2-1 前缀符号表
提示:表2-1中,数据类型栏表示定义的变量为哪个类型,则在该变量前增加对应的前缀,表示该变量为某个类型。例如,下面变量就是符合匈牙利命名法的变量声明。
Char *szName; //以0为结束符的符串,存储的是名字变量 BOOL bCanExit; //布尔型变量 DWORD dwMaxCount; //32位双字变量
2.2.3 变量的作用范围
在C++语言中,声明的变量主要分为全局变量和局部变量,其可以出现在程序的任何位置,在不同的位置声明,其作用域不同。
● 全局变量:其说明语句不在任何一个类定义、函数定义或复合语句(程序块)中的变量。全局变量所占用的空间在内存的数据区,在程序运行的整个过程中位置保持不变。
● 局部变量:其说明语句在某一个类定义、函数定义或复合语句(程序块)中的变量。局部变量所占用的空间在为程序运行时所设置的临时工作区中,以堆栈的形式允许反复占用和释放。
【范例2-2】变量的作用范围。范例2-2通过声明变量语句的位置,来确定全局变量和局部的作用域。
打开Visual C++ 6.0的集成开发环境,单击菜单【File】/【New】,弹出【New】对话框。单击其【File】选项卡,选择其中的【C++ Source File】项,并在右侧填写文件名及路径。在该示例中,文件名为“2-2”,并选择该文件的保存路径,如图2-1所示。
确定输入及选择的保存路径无误后,单击【OK】按钮完成建立源程序。系统进入C++源程序的编辑界面后,在其中输入如代码清单2-2所示的代码。
代码清单2-2
1 #include <iostream.h> //预处理文件 2 void main() //主函数 3 { 4 int a=0; 5 int b=0; //定义全局变量a,b,并赋初值0 6 a++; 7 b++; //将a加1后赋给a,将b加1后赋给b 8 cout<<"a="<<a<<","<<"b="<<b<<endl; //输出a,b的值 9 { 10 float a=0.5; //定义局部变量a 11 a++; 12 b++; //变量a,b递加 13 cout<<"a="<<a<<","<<"b="<<b<<endl; //输出a,b的值 14 } 15 a++; 16 b++; //变量a,b递加 17 cout<<"a="<<a<<","<<"b="<<b<<endl; //输出a,b的值 18 }
【运行结果】在Visual C++ 6.0中运行上述代码,其运行结果如图2-6所示。
图2-6 变量的作用范围
【范例解析】在范例2-2代码段中,全局变量int型a的作用范围为4~8行和15~17行,全局变量int型b的作用范围为5~17行,而局部变量float型a的作用范围为10~14行。在上述代码中,主要使用了变量的声明语句和输出语句。
提示:在实际的应用程序中,如果涉及全局变量,读者应仔细分析其中每个变量在程序中的作用范围及判断其值的变化。
2.2.4 变量应用示例
为了更好地说明变量在具体程序中的应用,下面也通过一个实例对其进行讲解。在2.1.2节中介绍了计算圆面积的程序实现,但其半径只能在程序中指定,不能接收用户输入而根据输入计算面积。下面对上述实例进行修改,使其达到接收用户输入而计算面积的目的。
【范例2-3】根据用户输入计算圆面积。该范例根据用户输入圆的半径来计算其面积,其使用到了变量,操作步骤如下。
打开Visual C++ 6.0的集成开发环境,单击菜单【File】/【New】,弹出【New】对话框。单击其【File】选项卡,选择其中的【C++ Source File】项,并在右侧填写文件名及路径。在该示例中,文件名为“2-3”,并选择该文件的保存路径,如图2-1所示。
确定输入及选择的保存路径无误后,单击【OK】按钮完成建立源程序。系统进入C++源程序的编辑界面后,在其中输入如代码清单2-3所示的代码。
代码清单2-3
1 #include <iostream.h> //预处理文件 2 void main() 3 { 4 const double pi=3.141592635898; //定义圆周率常量pi 5 double radius; //定义半径变量radius 6 double area; //定义面积变量area 7 cout<<"Please input radius"<<endl; 8 cin>>radius; //输入半径 9 area=pi*radius*radius; //计算面积 10 cout<<"area of circle of radius " << radius << " is "<<area<<"\n"; 11 //输出结果 12 }
【运行结果】运行上述程序后,输入半径8.5,其运行结果如图2-7所示。
图2-7 变量应用示例
【范例解析】范例2-3代码中,声明了两个变量radius和area,其中radius用于接收用户输入的半径,area用于存储计算得出的面积,最后输出。
注意:比较2.1.2节中的范例2-1与范例2-3,读者可以发现,其不同点就在于前者使用常量,而后者使用变量,通过接收用户的输入来计算圆面积,这是较为实用的。
在具体的应用中,变量的使用非常广泛,几乎每个代码段中都需要使用到,在后续的实例中读者还将看到。