4. 赋值

定义了变量之后,我们要把值存到它们的存储空间里,可以用赋值(Assignment)语句实现:

char firstletter;
int hour, minute;
firstletter = 'a';   /* give firstletter the value 'a' */
hour = 11;           /* assign the value 11 to hour */
minute = 59;         /* set minute to 59 */

注意,变量一定要先定义再使用,编译器必须先看到你的定义语句,才知道firstletterhourminute是变量名,代表一块存储空间,下面使用时才知道去哪里找这个变量的存储空间。还要注意,这里的等号不表示数学里的相等关系,和1+1=2的等号是不同的,这里的等号表示赋值。在数学上不会有i=i+1这种等式成立,而在C语言中,这个语句表示把变量i的存储空间中的值取出来,再加上1,得到的结果再存回i的存储空间中。再比如,在数学上a=7和7=a是一样的,而在C语言中,后者是不合法的。总结一下:定义一个变量,就是分配一块存储空间并给它命名;给一个变量赋值,就是把一个值存到了这块存储空间中。变量的定义和赋值也可以一步完成,这称为变量的初始化(Initialization),例如要达到上面代码的效果也可以这样写:

char firstletter = 'a';
int hour = 11, minute = 59;

在初始化语句中,等号右边的值叫做Initializer,例如上面的'a'、11和59。注意,初始化是一种特殊的变量定义语句,而不是一种赋值语句。就目前来看,先定义一个变量再给它赋值和定义这个变量的同时给它初始化所达到的效果是一样的,事实上C语言的很多语法规则既适用于赋值也适用于初始化,但在以后的学习中你也会了解到它们之间的不同,请在学习过程中注意总结赋值和初始化的相同之处和不同之处。如果在纸上“”一个程序(每个学编程的人都要练这项基本功),可以用一个框表示一个变量的存储空间,在框的外边标上变量名,在框里存上它的值,这也是本书常用的表示方法,如下图所示。

图 2.1. 在纸上表示变量

在纸上表示变量

你可以用不同形状的框表示不同类型的变量,这样可以提醒你给变量赋的值必须符合它的类型。如果所赋的值和变量的类型不符会导致编译器报警或报错(这是一种语义错误),例如:

int hour, minute;
hour = "Hello.";       /* WRONG ! */
minute = "59";         /* WRONG !! */

注意第3个语句,把"59"赋给minute看起来像是对的,但是类型不对,字符串不能赋给整型变量。既然可以为变量的存储空间赋值,就应该可以把值取出来用,现在我们取出这些变量的值用printf打印:

printf("Current time is %d:%d", hour, minute);

也就是说,变量名除了用在等号左边表示赋值之外,用在别的地方都表示把它的值取出来替换在那里。在计算机中不同类型的变量所占的存储空间大小是不同的,变量的最小存储单位是字节(Byte),在C语言中char型变量的存储空间是一个字节,其它类型的变量占多少个字节在不同平台上有不同的规定,以后再详细讨论。