3.3 认识变量
在程序运行期间其值可以改变的量称为变量。变量是在程序运行过程中可以发生变化的数据。变量概念的引入,可以简化程序员直接使用内存地址来操作数据的工作。用变量来存储程序中需要处理的数据,可在程序中根据需要随时改变变量的值,所以比常量更灵活,应用程序中变量的使用远远多于常量。
在学习数学时,为了用一个符号代表一个可以变化的量,通常是设未知数。而在C++中,为了存放一个值可以发生改变的量,我们引入变量的概念。变量用于在程序中存储数据。
3.3.1 变量的声明
C++中的变量声明是向编译器保证变量以给定的类型和名称存在,这样编译器在不知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
【例3-8】编写程序,完成变量的运算。
(1)在Visual Studio 2017中,新建名称为“3-8.cpp”的Project8件。
(2)在代码编辑区域输入以下代码。
【程序分析】在代码中,声明了三个int型变量:x、y和a,还有一个float型变量f。声明变量就是告诉编译器有这四个变量x、y、a、f,但是并没有给它们建立存储空间。在main()函数中将这四个变量定义之后,编译器就为它们建立存储空间。在代码第11行到第14行是给变量进行赋值,然后在代码第15行和第16行输出变量的结果。
在Visual Studio 2017中的运行结果如图3-10所示。
图3-10 声明变量
3.3.2 变量的定义
变量的定义实际上是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量通常指定一个数据类型,并包含了该类型的一个或多个变量的列表。
1. 定义一个变量
定义一个变量,需要做以下两件事情。
(1)定义变量的名称。按照标识符的规则,根据具体问题的需要任意设置。
(2)给出变量的数据类型。根据实际需要设定,设定的数据类型必须是系统所允许的数据类型中的一种。
在C++语言中,定义一个变量的完整格式是:
存储类别名 数据类型名 变量名1=表达式1,…变量名n=表达式n;
其中,存储类别名有static、extern、auto等类别,我们在后面的学习中会学到。数据类型名必须是一个有效的C++数据类型,可以是char、wchar_t、int、float、double、bool或任何用户自定义的对象,变量名可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。
下面列出几个有效的声明:
2. 变量的声明和定义
C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。为了将程序分为许多文件,则需要在文件中共享代码,例如一个文件的代码可能需要另一个文件中定义的变量。
为了支持分离式编译,C++允许将声明和定义分离开来。变量的声明规定了变量的类型和名字,即使一个名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。定义则负责创建与名字关联的实体,还负责申请存储空间。
如果想声明一个变量而非定义它,就在变量名前添加extern关键字,而且不要显式地初始化变量:
但用户也可以给由extern关键字标记的变量赋一个初始值,但这样就不是一个声明了,而是一个定义:
注意:变量能且只能被定义一次,但是可以被声明多次。
3.3.3 变量的作用域
作用域是程序的一个区域,一般来说有三个地方可以定义变量。在函数或一个代码块内部声明的变量,称为局部变量。在函数参数的定义中声明的变量,称为形式参数。在所有函数外部声明的变量,称为全局变量。在后续的章节中会学习到什么是函数和参数。本章先来讲解如何声明局部变量和全局变量。
1. 局部变量
在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。
【例3-9】编写程序,完成局部变量的运算。
(1)在Visual Studio 2017中,新建名称为“3-9.cpp”的Project9文件。
(2)在代码编辑区域输入以下代码。
【程序分析】本程序通过定义4个局部变量,并对其进行初始化运算。
在Visual Studio 2017中的运行结果如图3-11所示。
图3-11 局部变量
2. 全局变量
在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。
全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。下面的实例使用了全局变量和局部变量。
【例3-10】编写程序,完成全局变量的运算。
(1)在Visual Studio 2017中,新建名称为“3-10.cpp”的Project10文件。
(2)在代码编辑区域输入以下代码。
【程序分析】本例在主函数main()外面定义了一个int型的全局变量x,在main()函数中定义了两个局部变量a和b,并初始化赋值。最后将a与b相加赋给全局变量x并输出。
在Visual Studio 2017中的运行结果如图3-12所示。
图3-12 全局变量
注意:在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。
【例3-11】编写程序,认识全局变量和局部变量的作用域。
(1)在Visual Studio 2017中,新建名称为“3-11.cpp”的Project11文件。
(2)在代码编辑区域输入以下代码。
【程序分析】本例在主函数main()外面定义了两个int型的全局变量x和y,在main()函数中定义了一个局部变量x,局部变量和全局变量的名称可以相同。但在输出时,只输出了局部变量的值。
在Visual Studio 2017中的运行结果如图3-13所示。
图3-13 局部变量覆盖全局变量
3.3.4 变量的命名规则
C++程序中出现的每个变量都是由用户在程序设计时命名并定义的。C++规定所有的变量必须先定义后使用。变量命名时要注意以下几点:
(1)变量名必须按照C++语言规定的标识符命名原则命名。在C++中标识符用来定义变量名、函数名、类型名、类名、对象名、数组名、文件名等,其只能由字母、数字和下画线组成,且第1个字符必须是字母或下画线。例如sum、a、i、num、x1、area、_total等都是合法的变量名,而2A、a!、x 1、100等都不是合法的变量名。
(2)由于C++语言严格区分大小写字母,因此Sum和sum被认为是不同的变量名。为了避免混淆,应该使用不同的变量名,而不是通过大小写来区分变量。
(3)对变量名的长度(标识符的长度)没有统一的规定,随系统的不同而有不同的规定,一般来说,C++编译器肯定能识别前31个字符。所以标识符的长度最好不要超过31个字符,这样可以保证程序具有良好的可移植性,并能够避免发生某些令人费解的程序设计错误。许多系统只确认31个有效字符,所以在取名时,名称的长度应尽量在31位有效字符之内。
(4)在选择变量名和其他标识符时应做到“见名知义”“常用取简”“专用取繁”,例如count、name、year、month、student_number、display、screen_format等,使人一目了然,以增强程序的可读性。即用有含义的英文单词或英文单词缩写做标识符。
C++语句中以标识符命名程序中的对象名,如函数、变量、符号常量、数组、指针、数据类型等。标识符是由字母、数字和下画线等组成的,但第1个字符必须是字母或下画线。习惯上符号常量、宏名等用大写字母,变量、函数名等用小写字母,系统变量则以下画线开头。
3.3.5 变量的赋值和初始化
定义了变量的名称与数据类型后,C++语言系统在编译时就会根据这个变量的数据类型在内存中分配相应的内存空间,用于存放变量的值。C++语言系统允许在定义变量时对它赋予一个初值,这称为变量初始化。初值可以是常量,也可以是一个有确定值的表达式。
语法格式为:
类型说明符 变量名=初始数据;
其中,“=”是赋值运算符,表示将初始数据存入变量名所代表的内存单元。
例如:
float a, b=5.78*3,c=2*sin(2.0);
表示定义了a,b,c为单精度浮点型变量,对b初始化为5.78*3,对c初始化为2*sin(2.0),在编译连接后,从标准函数库得到正弦函数sin(2.0)的值,因此变量c有确定的初值。变量a未初始化。
如果对变量未赋初值,则该变量的初值是一个不可预测的值,即该存储单元中此时的内容是不确定的。初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。
例如:
int x=5;
相当于以下两个语句:
对多个变量赋予同一初值,必须分别指定,不能写成:
float a=b=c=9;
而应写成:
float a=9, b=9, c=9;
在C++语言中允许在变量声明的同时对变量赋值,称为变量的初始化,也叫变量赋初值。在程序设计中常常需要对变量赋初值。