
2.4 变量
2.4.1 变量的定义
程序在运行过程中其值可以发生改变的量就是变量。
对于变量,C语言有以下规定:
(1)变量要有变量名,在使用前必须先定义。概括起来就是“按名访问,按址存取”和“先定义后使用”。
(2)变量在内存中占据一定的存储单元,不同类型的变量其存储单元的大小不同。这也是需要先定义变量后使用的道理所在,等于是先申请空间后使用。
(3)存储单元里面存放的是该变量的值。
C语言中变量的类型有整型变量、实型变量、字符型变量这三类。
2.4.2 整型变量
C语言中变量基本类型及长度如表2-3所示。
(1)基本型用int表示,int就是整数的意思。
(2)短型用short int表示,也可用short表示。
(3)长型用long int来表示,也可用long表示。
(4)C 99标准中增加了long long int类型,可以简写为long long。
无符号型又与基本型、短型和长型组合构成了以下几种类型。
(1)无符号整型:unsigned int,简写为unsigned。
(2)无符号短型:unsigned short int,简写为unsigned short。
(3)无符号长型:unsigned long int,简写为unsigned long。
(4)无符号64位整数:unsigned long long int,简写为unsigned long long。
表2-3 C语言中变量基本类型及长度

【例2.3】以下程序可以测试并显示用户所在计算机系统中整型变量的数值范围。


【例2.4】以下程序可以测试并显示用户所在计算机系统中无符号数的数值范围。

注意
关于整型变量的溢出:
整型变量会溢出,以short类型为例,short类型最大值为32767,加1以后会变为-32768。本来32767加1以后已经超出了short类型最大的数值范围,但是系统不报错,而是将其值变为-32768。其他类型的数据也会发生类似的情况,因此,需要在编程中格外小心。
2.4.3 实型变量
实型变量也称为浮点型数据,主要分为单精度数和双精度数,单精度数用关键字float定义,32位。双精度数用关键字double定义,64位。单精度数提供7位有效数字,双精度数一般提供15~16位有效数字。
关于浮点型数据的数据精度,需要明确一点:由于计算机使用二进制无法准确地表示某些带小数位的十进制数据,因此,无论是单精度数或者双精度数,都存在一定误差。也就是说,float和double都不能保证可以精确地存储一个小数。例如:

此时,根据数学知识,人们想当然地给出答案是0.05。但其实不是,运行该段程序后,计算机给出的答案是0.0499999523。
再比如:

输入:1.123456789
输出:1.12345684
可以发现,只有小数点后面6位才是精确值。
因此,使用浮点型数据需要注意两个方面:
(1)浮点型数据超过有效位数,则产生误差。
(2)要避免一个很大的数与一个很小的数加减,例如:

运行结果:

(3)对浮点型数据尽量避免使用“==”“!=”这样的运算,由于浮点型数据的误差问题,这类运算符可能会得不到正确的结果。因此,建议尽量使用“>”“<”“>=”“<=”来处理判断相等或不相等的问题。
C99标准中添加了一个long double类型,但有些编译系统对其没有实现。而在C99及后续的规范中,对于该类型规定的也并不详细,只是要求long double类型在精度上需要不少于double类型的精度。于是就出现了有的编译器不支持long double类型,而支持的编译器在实现上也有所区别,目前常见的long double类型有占用8字节、10字节、12字节和16字节四种。
【例2.5】下面程序可以测试并显示用户所在计算机系统中实数的数值范围。


在C语言中,专门有一个运算符sizeof是用来测试各种类型所占用的字节数的。它的用法是:sizeof(检测类型),作用是获取检测类型的大小。返回的变量最好不要用int类型,而应该使用size_t类型,size_t在stdio.h、stddef.h中都有定义。
【例2.6】下面的程序可以检测获取已知类型的大小。

2.4.4 字符型变量
字符型变量的作用是用来存放字符常量,用关键字char来定义,每个字符型变量中只能存放一个字符,系统为每个字符型变量只分配一个字节的存储空间。
字符型变量的存储方法,其实质是存储该字符对应的ASCII码到存储单元中。比如。

实际上是在a和b两个存储单元中存放120(x的ASCII码)和121(y的ASCII码)的二进制代码。a单元存放"01111000",b单元存放"01111001"。
char字符类型同样可以添加unsigned,形式为unsigned char,范围为0~255。
字符型数据与整型数据之间可以通用,一个字符能用字符型数据的形式输出,也能用整型数据的形式输出。C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符型变量按整型量输出,也允许把整型变量按字符型变量输出。
注意
整型变量为二字节量,字符型变量为单字节量,当整型变量按字符型变量处理时,只有低于八位字节参与运算和处理。
字符型数据进行算术运算,相当于对它们的ASCII码进行运算。
【例2.7】字符型数据的运算。

对于字符型变量,虽然表面看上去是char类型,但却常常把它当作-128~127之间的小整数来使用。下面的程序例子就典型地说明了这一点。
【例2.8】字符型数据当作小整数来使用。

