C语言入门很轻松(微课超值版)
上QQ阅读APP看书,第一时间看更新

3.3 使用变量

变量是指在程序运行过程中其值可以改变的量。在程序定义变量时,编译系统就会给它分配相应的存储单元,用来存储数据,变量的名称就是该存储单元的符号地址。

3.3.1 认识变量

在C语言程序设计中,变量用于存储程序中可以改变的数据。形象地讲,变量就像一个存放东西的抽屉,知道了抽屉的名字(变量名),也就能找到抽屉的位置(变量的存储单元)以及抽屉里的东西(变量的值)。当然,抽屉里存放的东西是可以改变的,也就是说,变量值也是可以变化的。

从上面的叙述不难看出,变量具有4个基本属性。具体介绍如下:

(1)变量名:一个符合规则的标识符。

(2)变量类型:C语言中的数据类型或者是自定义的数据类型。

(3)变量位置:数据的存储空间位置。

(4)变量值:数据存储空间内存放的值。

程序编译时,会给每个变量分配存储空间和位置,程序读取数据的过程,其实就是根据变量名查找内存中相应的存储空间,从其内取值的过程。

【例3.7】编写程序,使用变量输出偶数2和4,然后再输出大写字母A和B(源代码\ch03\3.7.txt)。

图3-7 例3.7的程序运行结果

程序运行结果如图3-7所示。从输出结果可以看出,变量i和y两次输出的值不一样。

在本实例代码中变量i和y是先进行定义的,而且变量i和y都进行了两次赋值,可见,变量在程序运行中是可以改变它的值的。例3.7代码中的第5行和第7行是给变量赋初值的两种方式,是变量的初始化。

☆大牛提醒☆

变量的名称可以由字母、数字和下画线字符组成,它必须以字母或下画线开头,大写字母和小写字母是不同的,因为C语言是区分字母的大小写的。

3.3.2 变量的声明

变量声明的作用是向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量的声明有两种情况:

(1)一种是需要建立存储空间的。例如:int a在声明的时候就已经建立了存储空间。

(2)另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。例如:extern int a,其中变量a可以在别的文件中定义的。

变量的声明包括变量类型和变量名两个部分,其语法格式如下:

     变量类型   变量名

int num;double area;char c等语句都是变量的声明,在这些语句中,int、double和char是变量类型,num、area和c是变量名。这里的变量类型也是数据类型的一种,即变量num是整型,area是双精度浮点型,c是字符型。

变量类型是C语言自带的数据类型和用户自定义的数据类型。C语言自带的数据类型包括整型、字符型、浮点型、枚举型和指针类型等。

【例3.8】编写程序,在程序首部声明变量,从而计算两数之和,这里变量的定义与初始化在主函数内(源代码\ch03\3.8.txt)。

图3-8 例3.8的程序运行结果

程序运行结果如图3-8所示。从输出结果可以看出,变量x和y相加之后的值为“211”。

变量名其实就是一个标识符,当然,标识符的命名规则在此处同样适用。因此,变量命名时需要注意以下几点:

· 命名时应注意区分大小写,并且尽量避免使用大小写上有区别的变量名。

· 不建议使用以下画线开头的变量名,因为此类名称通常是保留给内部和系统的名字。

· 不能使用C语言保留字或预定义标识符作为变量名。如int、define等。

· 避免使用类似的变量名。如total、totals、total1等。

· 变量的命名最好具有一定的实际意义。如sum一般表示求和,area一般表示面积。

· 变量的命名需放在变量使用之前。

☆大牛提醒☆

如果变量没有经过声明而直接使用,则会出现编译器报错的现象。

3.3.3 变量的赋值

既然变量的值可以在程序中随时改变,那么,变量必然可以多次赋值。变量除了通过赋值的方式获得值外,还可以通过初始化的方式获得值。把第一次的赋值行为称为变量的初始化。也可以这么说,变量的初始化是赋值的特殊形式。

下面给出几个变量赋值的语句:

     int i;
     double f;
     char a;
     i=10;
     f=3.4;
     a=’b’;

在这个语句中,前3行是变量的定义,后3行是对变量赋值。将10赋给了整型的变量i,3.4赋给了双精度浮点型的变量f,字符b赋给了字符型的变量a。后3行都是使用的赋值表达式。

从上述语句不难得出,对变量赋值的语法格式如下:

     变量名=变量值;

对变量的初始化格式如下:

     变量类型 变量名=初始值;

其中,变量必须在赋值之前进行定义。符号“=”称为赋值运算符,而不是等号。它表示将其后边的值放入以变量名命名的变量中。变量值可以是一个常量或一个表达式。例如:

     int i=5;
     int j=i;
     double f=2.5+1.8;
     char a=’b’;
     int x=y+2;

更进一步,赋值语句不仅可以给一个变量赋值,还可以给多个变量赋值,格式如下:

     变量类型 变量名1=初始值,变量名2=初始值...

例如:

     int i=8,j=10,m=12;

上面的代码分别给变量i赋了8,给变量j赋了10,给变量m赋了12,相当于语句:

     int i,j,m;
     i=8;
     j=10;
     m=12;

☆大牛提醒☆

变量的定义是让内存给变量分配内存空间,在分配好内存空间后,程序没有运行前,变量会分配一个不可知的混乱值,如果程序中没有对其进行赋值就使用的话,势必会引起不可预期的结果。所以,使用变量前务必要对其初始化,而且只有变量的数据类型相同时,才可以在一个语句中进行初始化。

【例3.9】编写程序,通过给变量赋值,计算奇数3与5的和(源代码\ch03\3.9.txt)。

程序运行结果如图3-9所示。

图3-9 例3.9的程序运行结果

3.3.4 变量的分类

变量按其作用域可分为局部变量和全局变量。全局变量在整个工程文件内都有效,其中静态全局变量只在定义它的文件内有效;局部变量在定义它的函数内有效,当函数返回后失效,静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失,只有程序结束后才释放内存。

1.局部变量

局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。如下面的代码段:

x,y作用域在函数fun内定义了三个变量a、b、c。在fun的范围内a、b、c有效,或者说a、b、c变量的作用域限于fun内。同理,x,y的作用域限于主函数main()内。

☆大牛提醒☆

局部变量也只有局部作用域,它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

2.全局变量

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,而是属于一个源程序文件,其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明,只有在函数内经过说明的全局变量才能使用。全局变量具有全局作用域,只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

例如下面的代码段:

从上例可以看出a、b、c、d都是在函数外部定义的外部变量,都是全局变量。但c、d定义在函数fun1()之后,而函数fun1()内又没有对c、d加以说明,所以它们在函数fun1()内无效。a、b定义在源程序最前面,因此在函数fun1()、函数fun2()及主函数main()内不加说明也可使用。

【例3.10】编写程序,使用全局变量定义长方体的长、宽、高,通过键盘输入长方体的长、宽、高值,求出长方体的体积以及三个不同面的面积(源代码\ch03\3.10.txt)。

程序运行结果如图3-10所示,根据提示输入长、宽、高,按Enter键,即可计算出长方体的体积与三个不同面的面积,如图3-11所示。

图3-10 例3.10的程序运行结果

图3-11 计算长方体的体积与面积

该实例中定义了三个全局变量ar1,ar2,ar3,用来存放三个面积,其作用域为整个程序。函数vol()用来求长方体的体积和三个面积,函数的返回值为体积v。由主函数完成长宽高的输入及结果输出。

☆大牛提醒☆

C语言规定函数返回值只有一个,当需要增加函数的返回数据时,用全局变量是一种很好的方式。本例中,如不使用全局变量,在主函数中就不可能取得v,ar1,ar2,ar3四个值。而采用了全局变量,在函数vol()中求得的ar1,ar2,ar3在主函数main()中仍然有效。因此全局变量是实现函数之间数据通信的有效手段。