
1.9 变量

视频讲解
变量和常量是程序处理的两种基本数据对象。在学习任何东西之前,都需要先搞懂一个问题,那就是为什么需要它。当弄懂了一个概念为什么会存在的时候,也就理解了它存在的意义,顺便也掌握了相关的知识。
通常会在内存中找一个位置来存放CPU要处理的数据,每个存放数据的位置都有一个“地址”,通过这个地址,CPU就可以找到并使用它们。这个存放数据的位置就是变量。
每个变量都有一个地址,这个地址其实就是一串数字,CPU尤其擅长处理复杂的数字,但我们人类不一样,我们常常为了怕忘记一个电话号码而要拿一个小本记起来,更别说这些复杂的数字了。所以后来发明了变量名,变量名就是给一个数据的“地址”贴标签。这与小时候喜欢根据小伙伴的特点起外号是一样的,我们也根据这些数据的用途给它们起一个好记的名字,这就是变量名,一旦变量有了名字,就可以通过直呼其名的方式来使用它们。
给变量起名字可是有讲究的,C语言变量命名需要遵守以下规则。
·C语言变量名只能由英文字母(A~Z, a~z)和数字(0~9)或者下画线(_)组成,其他特殊字母不行。下画线通常用于连接一个比较长的变量名,如i_love_fishC。
·变量名必须以英文字母或者下画线开头,不能用数字开头。
·变量名区分大小写。C语言是大小写敏感的编程语言,也就是大写的FISHC跟小写的fishc会被认为是两个不同的名字。在传统的命名习惯中,用小写字母来命名变量,用大写字母来表示符号常量名。
·不能使用关键字来命名变量。
什么是关键字?关键字就是C语言内部使用的名字,这些名字都具有特殊的含义。如果把变量命名为这些名字,那么C语言就搞不懂你到底想干什么了。
传统的C语言(ANSI C)有32个关键字,如下:

C语言历史悠久,随着时代的发展,C语言也在不断地进行改善。之前提到,设计一门编程语言,其实就是设计一套规则和约定,那么C语言的这套规则最初叫做ANSI C,这32个关键字就是ANSI C定义的。
1999年,ISO发布了C99标准,对C语言做了很大的改进。C99标准增加了5个关键字:inline、restrict、_Bool、_Complex和_Imaginary。
2011年,ISO发布了最新的C11标准,这次加入了一些很炫酷的语言特征。C11标准又增加了7个关键字:_Alignas、_Alignof、_Atomic、_Static_assert、_Noreturn、_Thread_local和_Generic。
ANSI C、C99和C11,它们之间差别并不大,在大多数情况下,它们都是和谐共处的,以后遇到有区别时会给大家指出来。
为变量指定名字之后,还需要为变量指定“坑位”的大小,即指定该变量即将存放的数据类型。因为不同的数据它的尺寸不一样,所以如果把每个坑都挖得很大,是可以存放任何数据类型,但也会造成浪费;如果把每个坑挖得很小,是可以节省一点,但大号的数据又放不进去。
下面是C语言常用的基本数据类型。
·char——字符型,占用一个字节。
·int——整型,通常反映了所用机器中整数的自然长度。
·float——单精度浮点型。
·double——双精度浮点型。
在声明变量的时候需要指定数据类型,声明变量的语法为:

注意:
/* */中间的内容是注释,用于帮助程序员理解代码,编译器不予理会。
接下来看一个程序,然后逐句给大家分析:

程序实现如下:

变量在声明之后就可以使用它,如:

该语句就是将变量a赋值为整数520(注意:C语言中的语句以分号结束)。

这条语句则是将变量b赋值为字符'F',字符类型用单引号括起来;1.8节printf函数中双引号包含的是字符串,字符串就是一串字符,所以C语言的命名还是很科学的。

存放整数的类型叫整型,存放字符的类型叫字符型。那什么是浮点型呢?没错,就是存放浮点数的类型。那浮点数又是什么呢?就是平时所说的,带有小数点的数。
单精度浮点型用于存放小数点后位数比较小的浮点数,对于位数比较大的,要用更大的空间来存储,那就是双精度浮点型。

最后,1.8节中讲到printf函数为格式化输出,那什么是格式化输出?这里就是一个很好的例子。所谓的格式化就是将这些不同的数据类型,转换为字符串的形式,最后打印出来。

%d表示字符串后边跟着的是一个整型的参数(就是变量a),在程序编译的时候就会将变量a转换并替换%d所在字符串的位置。

%c表示转换的目标是一个字符型数据。

%f表示转换的目标是一个浮点型数据,可以是单精度浮点型,也可以是双精度浮点型。“.2”表示精度,就是保留小数点后两位的意思。

同样地,这里变量d精确度比较高(小数点后9位),前边的11表示整个数据所占的总宽度是11位。
【扩展阅读】更多有关printf函数的知识大家可以访问http://bbs.fishc.com/thread-66471-1-1.html或扫描图1-10所示二维码查阅。

图1-10 printf函数文档