2.5 变量详解
变量就是可以变化的量,用来标记存储数据的内存空间,在尚未学习“指针”之前,只能通过变量操作内存空间,本章将从变量类型、变量名、变量值三个方面详细介绍变量。
2.5.1 定义变量
在C语言中,变量只有被定义才能使用,定义变量有两种形式。
第一种,先定义,后赋值。具体语法如下。
变量类型 变量名;
变量名 = 数据;
例如:
int a; //先定义int型变量a
a =200; //然后将200赋值给变量a
第二种,定义并赋值。具体语法如下。
变量类型 变量名=数据;
例如:
int a=200; //定义int变量a并赋值为200
【变量说明】
1.在程序中变量是用来保存数据的,一般情况下,数据的类型与变量的类型保持一致。如果要保存整数,变量类型应该声明为int;如果要保存字符,变量类型应该声明为char;如果要保存小数,变量类型应该声明为float或double。如图2-27所示。
图2-27 变量类型
2.程序中的“=”是赋值操作,例如,a=200,表示将200赋值给变量a,并不是数学中的相等比较,C语言中相等比较采用“==”(后续章节中会介绍)。
3.变量名必须符合C语言标识符命名规则。
2.5.2 引用变量
定义变量的目的在于方便引用,在C语言中引用变量分为两种情况。
(1)对变量进行赋值。
(2)读取变量中保存的数据。
那么该如何区分这两种情况?其实很简单,如果变量出现在“=”左边,就是对变量进行赋值,例如,
a =100;
如果变量出现在“=”右边或单独出现,就是读取变量中保存的数据。例如:
a=100;
b=200;
a=b;
printf(“%d\n”,a);
上述程序的第3行中变量a在“=”左边,变量b在“=”右边。因此,a=b执行过程为:先读取变量b中保存的数据200,然后赋值给变量a,此时变量a的值为200。
上述第4行中在printf函数中变量a是单独出现的,表示读取变量a中保存的数据。
下面通过例子来了解变量的定义与引用。
【示例2-19】 变量定义与引用。
01 #include<stdio.h>
02 int main()
03 {
04 int a=100; //定义int变量a并赋值为100
05 int b; //先定义int变量b
06 b=200; //然后将200赋值给变量b
07 a=b; //将变量b的值赋值给变量a
08 printf("a=%d\n",a); //输出变量a的值
09 printf("b=%d\n",b); //输出变量b的值
10 getchar();
11 return 0;
12 }
运行结果如图2-28所示。
图2-28 运行结果
【程序分析】
1.上述程序的第4行中,定义int变量a并赋值为100。
2.第5~6行,先定义int变量b,然后将200赋值给变量b。
3.第7行,先读取变量b的值,然后赋值给变量a。
4.第8行,先读取变量a的值,然后打印输出。
5.第9行,先读取变量b的值,然后打印输出。
2.5.3 定义多个变量
通过学习【示例2-19】,我们已经看到在程序中可以定义多个变量。C语言中,定义多个变量有两种形式。
第一种, 在一行语句中,定义多个变量,语法结构为:
变量类型 变量名1,变量名2,变量名3…… //变量之间以逗号分割
第二种,多行语句,定义多个变量,语句结构为:
变量类型 变量名1;
变量类型 变量名2;
……
下面通过例子来了解在程序中如何定义多个变量。
【示例2-20】 定义多个变量。
01 #include<stdio.h>
02 int main()
03 {
04 int a=100,b=200; //一行定义int变量a、b且赋值
05 int c=300; //定义变量c且赋值
06 int d=400; //定义变量d且赋值
07 printf("a=%d\n",a);
08 printf("b=%d\n",b);
09 printf("c=%d\n",c);
10 printf("d=%d\n",d);
11 getchar();
12 return 0;
13 }
运行结果如图2-29所示。
图2-29 运行结果
【程序分析】
1.上述程序的第4行中,一次定义两个int变量a、b并且分别赋值为100、200。
2.第5~6行,int变量c、d定义在2行中,并且分别赋值为300、400。
3.第7~10行,分别输出变量a、b、c、d的值。
2.5.4 变量的本质
变量本质上是一块有名字的内存空间。例如,int a=20。在程序运行期间,系统会根据变量的类型在内存中开辟对应大小的空间,保存20,并给这块空间起一个名称为a,如图2-30所示。
图2-30 变量的本质
理解变量的本质,需要深入了解以下两点。
(1)变量名a只是用来标记这块内存空间的,在程序中通过引用变量名a,就可以精准找到这块内存空间,然后访问该内存空间的数据20。
(2)变量值就是变量名标记的内存空间中的数据,变量值在程序运行期间是可以修改的。为了深入理解这个概念,读者可以把内存空间想象为一个盒子,把变量值想象为不同水果。当盒子中放的是苹果时,打开盒子看到的就是苹果,当盒子中放的是橘子时,打开盒子看到的就是橘子。盒子只是一个固定大小的容器,而盒中的水果是可以随时替换的。同理,变量也是如此,对应内存空间是固定的,而空间中的数据是可以随时修改的。
2.5.5 语句与语句块
在C语言中,程序执行的最小单位为语句,一条合法的语句必须在末尾有一个分号,分号是语句不可缺少的组成部分。
C语言中常用的语句有以下5种。
(1)赋值语句。
(2)函数调用语句。
(3)空语句。
(4)复合语句(语句块)。
(5)控制语句。
本小节只介绍前4种语句,第5种控制语句会在后续章节中单独介绍。
1. 赋值语句
赋值语句是C语言程序中最基本的语句,需要使用赋值符号“=”,该符号的作用是将一个数据赋值给一个变量,例如:
a = 100; //将100赋值给变量a
注意: 赋值语句中,赋值号“=”的左边必须是变量,不能是常量,否则程序编译时会报错。
2. 函数调用语句
函数调用语句是C语言程序中,比较常用的语句,由函数调用语句与分号构成,例如:
printf("www.rupeng.com");
该语句由函数调用printf("www.rupeng.com")与末尾的分号构成,后续章节中会详细介绍函数,对于该语句暂时只需简单了解即可。
3. 空语句
该语句只有一个分号,例如:
;
那它有什么作用呢?空语句经常作为循环语句的循环体,表示什么也不做。
4. 复合语句(语句块)
复合语句又被称为语句块,在程序中,使用{ }将多行语句括起来就可以成为复合语句,例如:
{
int a=3;
printf("a=%d\n",a);
}
左花括号“{”表示复合语句开始,右花括号“}”表示复合语句结束。复合语句不会影响程序的正常执行,常常和控制语句一起使用。
说明: 本书默认将复合语句称为语句块。
下面通过例子来简单了解语句块的使用。
【示例2-21】语句块的使用。
01 #include<stdio.h>
02 int main()
03 {
04 {
05 int a=300;
06 printf("a=%d\n",a);
07 }
08 getchar();
09 return 0;
10 }
运行结果如图2-31所示。
图2-31 运行结果
【程序分析】
(1)上述程序的第4行中,左大括号“{”表示程序块开始,第7行中,右大括号“}”表示程序块结束。
(2)第4~7行之间的语句为一个程序块,可以认为这些语句是一个整体,这种理解方式,对后续学习控制语句非常重要。
(3)根据输出结果可以看到,单独出现的语句块并不会影响程序的执行。
2.5.6 顺序结构
顺序结构是C语言程序中最简单的程序结构。顺序结构的程序从第一行语句开始,按照代码排列的顺序,从上至下逐句执行,上一条语句执行结束下一条语句才能执行,直到最后一条语句结束。顺序结构执行流程如图2-32所示。
图2-32 顺序结构执行流程图
下面通过例子来了解顺序程序结构。
【示例2-22】 顺序结构。
01 #include<stdio.h>
02 int main()
03 {
04 int a=10;
05 printf("a=%d\n",a);
06 a=20;
07 printf("a=%d\n",a);
08 a=30;
09 printf("a=%d\n",a);
10 getchar();
11 return 0;
12 }
运行结果如图2-33所示。
图2-33 运行结果
【程序分析】
本例程序是一个典型的顺序结构程序,计算机会按照语句排列的顺序从上至下依次执行,直到执行到return 0;主函数结束。