第三节 闹心的变量
不得不说,C语言里面最闹心的就属变量了。变量的数据类型、变量名、变量的初值、变量的地址……对于初学者来说,这些抽象的概念,都非常难以理解。在去年夏天的网络课程中,我也是专门花了一节课多的时间给大家来讲解变量。但是还有有不少的同学来找我问,到底什么是变量。
但是具体什么是变量呢?虽然很多教科书上喜欢说变量是一种容器,但是这种比喻在后期我们学习数组的时候就会变得抽象。我更倾向于把变量比喻成饭碗或者饭盒。那么我们既然把变量比喻成了饭盒,那么我们就要给这个饭盒贴一个商标,那么这个商标就叫做变量名。那么我们都知道,商品的商标是唯一的,一个商品一般只有一个商标,而且这个商标是不能和已经有的其他商标重复的。那么变量名也有这样的特点。变量名是唯一。在生活中,我们经常会用某些品牌的商标来指代产品。那么在程序中也是一样,我们要用变量名指代变量。那么变量名的命名规则呢,我们这里称为C语言标识符命名规则,这个规则如下:
1.标识符由英文字母、数字和下划线组成,区分大小写
2.标识符的第一位不能是数字
3.C语言的保留字不能作为标识符。
这里我们的变量名就属于标识符的一种。之后我们还会学到其他种类的标识符,命名规则类似。
这里我们说的C语言的保留字(也有关键字的叫法)包括的内容请看附录2。
另外呢,虽然标识符可以命名为库函数名和预编译处理命令,但是如果那么做了,库函数名和预编译处理命令,就会失去本来系统已经规定好的原意。至于什么是库函数名和预编译处理命令我们后面还会详细的讲解。在近期我们统一使用按照字母表顺序的小写字母作为标识符。等到我们讲完C语言的基础知识,我们就可以尝试使用较为正式的标示符作为变量名了。
说了这么多,我们还没有讲怎么使用变量呢。我们既然把变量比喻成饭盒,我们就现需要买一个饭盒。在C语言中我们把这个类似于买饭盒的过程叫做定义变量。(也有称为声明变量的说法)商店里面的商品琳琅满目,饭盒的种类也多种多样,有塑料的,有铝质的等等。那么我们的变量的种类也是多种多样的。那么我们现在暂时先接触一种最简单,最基本的变量——整型变量。
整形变量的概念和整数有一点儿像,但是又不完全一样。如果把变量比喻成饭盒,那么数据就可以比喻成饭菜。如果一个数据是整数,那么我们就要用整型变量来盛放它。这就像我们生活中,盛汤的有汤碗,盛饭的有饭碗一样。专碗专用。那么变量也是这样,某一类型的变量就专门用了盛放某一类型的数据,不能混用。(也有混用的情况,但是暂时还不涉及) 闲言少叙,直接看下面的例子:
例1-5
#include<stdio.h>
main(){
int a;
a=5;
printf("整型变量a的值是%d
",a);
system("pause");
}
那么在这个程序里面printf("整型变量a的值是%d
",a);是我们非常熟悉的内容,这里面的新内容只是把参数列表里面的数字和式子换成了变量名a,int a;这一条语句的含义是定义一个变量名为a的整型变量,就相当于我们去商店买饭盒的过程。a=5;叫做赋值语句,它的含义是把整数数值5赋值给a,相当于我们用饭盒盛饭的过程。更详细的解释就是,我们用了一个商标是a的饭盒成了饭,这里面的饭就是5这个数。接下来就到了我们熟悉的这一步printf("整型变量a的值是%d
",a);这里引号里面的格式化字符串除了转义字符和格式说明符以外的部分原样输出,遇到%d格式说明符应该用后面参数列表里面的值去替换,参数列表里面有一个a,那么a恰巧又是个变量名。之前讲解过,变量会被变量名所指代,那么反过来看到变量名应该想到这个变量名代表的变量,那么a所代表的变量里面的数值的整数5,那么这个%d就会被5替换。最后遇到转义字符
,它是个换行符,运行结果如图1-7所示。
如果搞明白上面的内容,我们就可以进一步学习更有趣儿的东西了。我们接着再做一次例1-4的那个例子,但是这次我们使用变量。
例1-6
#include<stdio.h>
main(){
int a;
int b;
a=8;
b=5;
printf("%d+%d=%d
",a,b,a+b);
printf("%d-%d=%d
",a,b,a-b);
printf("%d×%d=%d
",a,b,a*b);
printf("%d÷%d=%f
",a,b,a/b);
system("pause");
}
运行我们的例1-6就会得到如图1-8的结果,除了8÷5之外的大获成功。那么似乎我们遇到了和之前类似的问题,除法似乎又任性了。那么根据之前的思路,我们需要把两个数改成小数的形式。但是我之前说过,某一类型的变量就专门用了盛放某一类型的数据,不能混用。既然把数写成了小数的形式,我们就认为这个数是小数,所以整型变量不能盛放小数。我们需要引入一个用于盛放小数的变量——单精度变量。
实际上,盛放小数的变量有很多种。我们这里先介绍一种最为常见的盛放小数的变量,它叫做单精度变量。之前也说过,变量可以理解为饭盒,所以无论什么样的变量,只要是变量它就可以理解为饭盒。要说明饭盒的材质,品牌,和里面盛放的饭菜。
对于整型变量来说有 int a;
那么类似的对于单精度变量有 float a;
这里int代表整型,float代表单精度。这是说明我们饭盒的材质。是塑料的,还是铝制的,还是不锈钢的。
a是变量名,相当于饭盒的商标。那么自然就有了下面的程序
例1-6修改1
#include<stdio.h>
main(){
float a;
float b;
a=8.0;
b=5.0;
printf("%f+%f=%f
",a,b,a+b);
printf("%f-%f=%f
",a,b,a-b);
printf("%f×%f=%f
",a,b,a*b);
printf("%f÷%f=%f
",a,b,a/b);
system("pause");
}
大功告成!注意变量的类型从int变成float之后,对应的格式说明符也要改变成%f。实际上我们还可以把这个程序写的简单一点儿。
a和b两个变量的类型都是float(单精度),那么我们可以说a品牌的饭盒是塑料的,b品牌的饭盒是塑料的。我们也可以说a品牌的饭盒和b品牌的饭盒都是塑料的。
那么C语言也给我们提供了这种偷懒的办法。
float a;float b;可以写成float a,b;这就是说两个变量都是float(单精度)的意思。
我们还可以把float a;float b;a=8.0;b=5.0;这四句话写在一起,变成float a=8.0,b=5.0;这只是C语言提供给我们的偷懒的途径。因为C语言本身就是懒人语言。如果你是一个勤劳的小蜜蜂,那么分开写也没有关系。只不过需要知道,更多的程序员更喜欢这种偷懒的写法。所以要适应这种懒惰的习惯。
例1-6修改2
#include<stdio.h>
main(){
float a=8.0,b=5.0;
printf("%f+%f=%f
",a,b,a+b);
printf("%f-%f=%f
",a,b,a-b);
printf("%f×%f=%f
",a,b,a*b);
printf("%f÷%f=%f
",a,b,a/b);
system("pause");
}
现在我们变量这一部分算解决了很大的难题。之后我们无论学习多复杂的程序,还有之后我们要一起做软件,这些都是最基础的内容,也是永远逃脱不掉的东西。希望大家多多复习这一部分的知识。