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=77=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);

變數名用在等號左邊表示賦值,而用在printf中表示把它的存儲空間中的值取出來替換在那裡。不同類型的變數所占的存儲空間大小是不同的,數據表示方式也不同,變數的最小存儲單位是位元組(Byte),在C語言中char型變數占一個位元組,其它類型的變數占多少位元組在不同平台上有不同的規定,將在第 15 章 數據類型詳解詳細討論。