C語言變數定義和賦值

2020-07-16 10:04:22
定義變數的格式非常簡單,如下所示:

資料型別  變數名;

首先要強調的一點是:最後的分號千萬不要丟了。變數的定義是一個語句,我們說過,語句都是以分號結尾的。

“資料型別”表示想要儲存什麼型別的資料就定義什麼型別的變數。想要儲存整數就定義成 int 型;想要儲存小數就定義成 float 型或 double 型;想要儲存字元就定義成 char 型……

“變數名”就是你想給這個變數起個什麼名字,通常都是用字母。比如:

int i;

就表示定義了一個整型變數 i。變數名的命名規則稍後會詳細地講。

那麼變數定義好之後怎麼將數放到這個變數裡面呢?首先要理解的是,將一個數位放到一個變數中,這個動作叫“賦值”。“賦”即“給予”的意思,所以“給變數賦值”意思就是將一個值傳給一個變數。那怎麼賦值呢?是通過賦值運算子=,賦值的格式是:

變數名 =  要賦的值;

它的意思是將=右邊的數位賦給左邊的變數。比如:
i = 3;
這就表示將 3 賦給了變數 i,此時 i 就等於 3 了。

這裡需要注意的是,這裡的=跟數學中的“等於號”是不一樣的。在剛開始學習C語言的時候,在這一點上大家很難從數學的思維中轉變過來。在C語言中=表示賦值,即將右邊的值賦給左邊的變數,而不是左邊的變數等於右邊的值。

那C語言中有沒有表示相等的運算子呢?這就是雙等號==。這個運算子就與數學中的“等於”是同一個意思了。

以上就是變數的定義和賦值,它們是分成兩步寫的。也可以將它們合成一步,而且事實上,在實際程式設計中用得最多的也是合二為一的寫法。那麼怎麼合在一起呢?很簡單,形式如下:

資料型別  變數名 = 要賦的值;

比如:

int i = 3;

就表示定義了一個變數 i,並把 3 賦給這個變數。它與

int i;
i =3;

是等價的。

在定義變數時也可以一次性定義多個變數,比如:

int i, j;

這就表示定義了變數 i 和 j。這裡需要強調的是,當同時定義多個變數時,變數之間是用逗號隔開的,千萬別寫成分號。這是很多新手最容易犯的錯誤,即將逗號和分號記混了。

同樣也可以在定義多個變數的同時給它們賦值:

int i = 3, j = 4;

中間還是用逗號隔開,最後別忘記輸入分號。

最後需要注意的是,在較老的 C89/C90 標準(也稱 ANSI C 標準)中,變數只能在程式的開頭定義,或者說變數定義的前面不能有其他非宣告或非定義的語句。比如在C語言中像下面這種寫法就是錯誤的:
# include <stdio.h>
int main(void)
{
    int i;
    i = 3;
    int j = 4;  //這句是錯誤的,因為在它前面有一個給變數i賦值的非定義語句
    return 0;
}
在 VC++ 6.0 或者 VS2010 下編譯的時候會提示下面的錯誤:

error C2143: 語法錯誤 : 缺少“;”(在“型別”的前面)

但是這種寫法在.cpp檔案(C++ 原始檔)中是允許的,.cpp檔案中可以在程式的任意位置定義變數。

其實這與語言本身並沒有什麼關係,並不是說C語言中變數就不能定義在程式中間。這實際上是與標準有關係的,有些編譯器使用的是 C89 標準,C89 標準要求所有宣告(比如函數宣告、變數定義)必須要寫在程式、函數或複合語句的開頭,而 C99 的新特性允許語句和宣告按任意順序排列,只要遵循“先宣告後使用”的原則就行。

因為 VC++ 6.0 和 VS2010 遵循的是 C89 標準,或者說它不能完全支援 C99 標準,所以它不允許將變數定義在程式中間;而 Linux 中 GCC 編譯器遵循的是 C99 標準,所以同樣是.c檔案,同樣是編寫C語言,它就可以將變數定義在程式的任意位置,只要是在使用位置之前即可。

其實 C99 標準是比較好的,變數需要的時候才定義,縮短了它的生命週期,節省了記憶體。因為只要定義變數,系統就會為它分配記憶體空間,所以如果在前面定義了但是到最後才使用它,那麼在使用之前它一直占著記憶體不放,有點浪費。

但是儘管如此,大家在程式設計的時候還是盡量按照 C89 的標準編寫,即使在完美支援 C99 標準的編譯器中也最好不要將宣告寫在程式的中間。因為 C89 歷時較長,現在它仍然是主流,很多編譯器仍然只支援 C89 標準或不能很好地支援 C99 標準。所以按 C89 標準編寫可移植性更強。

上面提到“複合語句”,在複合語句中也可以定義變數。所謂語句就是以分號結尾的,而複合語句就是多個語句組合在一起的語句。在C語言中,用大括號{ }括起來的多個語句稱為複合語句。

複合語句在流程控制中用得特別多,比如後面將要學習的 if、for、while 一般都是跟複合語句的。此時在這些複合語句中也可以定義變數,但是也只能定義在它的開頭。主函數 main 下面也是用大括號括起來的,所以主函數 main 下的函數體本質上也是一個複合語句,是一個大的複合語句。

所以它們還是有共性的,也就是說,在C語言中,只要是用大括號{ }括起來的,那麼在它的開頭都可以定義變數。而且這些在大括號中定義的變數都稱為區域性變數。此外,在大括號外面也可以定義變數,叫全域性變數。這個我們就先不講了,到後面再講。