- 從零開始:C語言快速入門教程
- 張繼新主編
- 2892字
- 2021-09-28 16:17:35
2.1 認識變量與常量

在介紹變量(variable)的正式定義前,先回到我們在第1章中利用printf()函數寫的簡單程序,現在為這個程序多加幾行語句,請讀者將【上機實習范例:CH02_01.c】程序自行輸入并編譯執行,然后從執行結果中反推看看這幾行新加的語句有什么功能。再次提醒,程序代碼前的行號是作為說明之用,千萬別將其當作程序代碼輸入程序中。
■【上機實習范例:CH02_01.c】
01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(void) 05 { 06 int a; /*聲明整數類型變量a */ 07 int b; /*聲明整數類型變量b */ 08 09 a=5; /*將a的值設定為5*/ 10 b=10; /*將b的值設定為10*/ 11 printf("a=%d b=%d a+b=%d\n",a,b,a+b); 12 /*輸出a,b,a+b的值 */ 13 14 return 0; 15 }
執行結果如圖2.1所示。

圖2.1
執行結果很簡單,就是輸出a、b、a+b三者的值。各位可以發現其中有幾行語句是陌生的,例如第6~7行就是將a與b聲明為整數類型變量。其中int是C語言中的關鍵字,表示聲明整數類型,如下所示。
int a; int b;
第9~10行就是分別設定a與b的初始值,第11行的printf()函數中使用了“%d”格式,其功能是以十進制整數格式來輸出變量的值。
簡單來說,“%d”第一次在printf()函數中出現是對應a的值,第二次出現對應b的值,第三次出現則對應a+b的值,另外printf()函數中兩個雙引號之間的文字會與這3個“%d”所對應的值一起輸出到屏幕上,輸出結果如下所示。
a=5 b=10 a+b=15
【上機實習范例:CH02_01.c】告訴我們應該如何聲明兩個整數變量,并分別輸出它們的值與兩者相加后的和,相信各位應該對變量的功能有一些了解了吧。
2.1.1 變量的簡介
剛剛我們提到的變量是程序語言中最基本的“角色”,也是在程序設計中由編譯器所配置的一部分具有名稱的內存,用來存儲可變的數據內容。如果程序需要存取某個內存的數據內容,就可通過變量將數據從內存中取出或寫入。
在使用變量之前,必須先聲明它用來存儲數據的類型,正確的變量聲明格式由數據類型、變量名稱與分號所構成,而變量名稱各位可以自行定義,并且有聲明后再設值與聲明時設值兩種方式,如下所示。
數據類型 變量名稱 1 ,變量名稱 2 ,… ,變量名稱n; 數據類型 變量名稱=初始值;
在C語言中共有整數(int)、浮點數(float)、雙精度浮點數(double)及字符(char)4種基本數據類型,可在聲明變量時使用,關于這些數據類型的詳細說明會在稍后的章節中講解。
兩種聲明方式的具體示例如下。
int a; /*聲明整數類型變量a,暫時未設定初始值*/ int b=12; /*聲明整數類型變量b并直接設定其初始值為12*/
C語言在編譯時才會解決變量配置的問題,如果要在C語言中使用變量,一定要事先聲明,然后才能使用,否則程序在編譯時會出現錯誤信息。至于是否要設定初始值則沒有強制規定,不過最好是在聲明變量時就指定它的初始內容,這樣也容易增強程序的可讀性。
2.1.2 變量的名稱
保證程序代碼的可讀性對一個優秀的程序設計師而言是非常重要的好習慣。雖然變量名稱在自行定義時只需符合C語言的規定即可,但是當變量很多時,如果你只是簡單取個abc等字母名稱,就會讓人暈頭轉向,且會大幅降低程序代碼的可讀性。你最好在事前多花點心思,取個比較有意義的名字,如sum代表總數、score代表成績等。
此外,變量的命名必須由英文字母、數字或者下劃線“_”所組成,不過首字符可以是英文字母或是下劃線,但不可以是數字,也不可以使用-,*$@…等符號或空格符,當然也不能使用與關鍵字相同的字符。C語言中共有32個關鍵字,在Dev C++中會以粗黑體表示,如表2.1所示。
表2.1

通常為了提高程序的可讀性,筆者建議一般變量以小寫字母表示,如name、address等,而常量則以大寫字母和下劃線“_”表示,如PI、MAX_SIZE。至于函數名稱則習慣以小寫字母開頭,如果由多個英文單詞組成,則其他英文單詞開頭字母用大寫,如copyWord、calSalary等。
2.1.3 變量的地址
當在程序中聲明變量時,編譯器會依照這個變量的數據類型所占用的字節數分配部分內存空間給這個變量,例如整數變量占用4字節,而浮點數變量則占用8字節。這個變量一旦聲明后,就會占用這個內存空間(也就是地址),不論內容如何改變,地址都不變,如圖2.2所示。

圖2.2
由于C語言中的數據類型所占用的字節不同,因此如果各位想知道某個變量到底占用了幾字節,C語言中的關鍵字sizeof就能派上用場了,使用格式如下。
sizeof變量或常量名稱; sizeof(變量或常量名稱);
以下程序就是利用sizeof來查詢整數變量與整數類型所占用的字節數目。
■【上機實習范例:CH02_02.c】
01 #include<stdio.h> 02 #include<stdlib.h> 03 04 int main(void) 05 { 06 int salary=100;/*聲明為整數類型*/ 07 08 printf( "salary的數據長度=%d字節\n",sizeof salary); /*不加括號 */ 09 printf( "整數類型的數據長度=%d字節\n",sizeof(int)); /*加上括號 */ 10 11 return 0; 12 }
執行結果如圖2.3所示。

圖2.3
程序解說
第8~9行中利用sizeof關鍵字來輸出變量salary與整數類型數據所占用的內存空間,雖然sizeof后面接不接括號都可以,但如果是查詢某些數據類型所占的位數,就一定要接括號了。
2.1.4 常量的簡介
常量是指程序在執行的整個過程中不能被改變的數值,例如整數常量45、-36、10005、0等,或者浮點數常量0.56、-0.003、1.234E2等。在C語言中,如果是字符常量,還必須用單引號引起來,如'a' 'c'。當常量為字符串時,必須用雙引號引住字符串,如"apple" "salary"等,它們都算是一種字符串常量。下面的a是一個變量,15則是一個常量。
int a; a=a+15;
常量在C語言程序中也如同變量一般,可以用一個符號來表示。在程序執行時,絕對無法改變的常量我們稱為“符號常量”,符號常量可以放在程序內的任何位置,但是一定要先聲明定義后才能使用,通常這樣做也是為了提高程序的可讀性。請利用關鍵字const和預處理器中的#define指令來聲明符號常量。聲明語法如下。
方式1: const數據類型 常量名稱=常量值; 方式2: #define常量名稱 常量值
請注意,由于#define為宏指令,并不是指定語句,因此不用加上“=”與“;”。以下兩種方式都可定義常量。
const int radius=10; #define PI 3.14159
Tips
所謂宏,又稱為“替代指令”,主要功能是用簡單的名稱取代某些特定常量、字符串或函數,善用宏可以節省不少程序開發的時間。
各位可能會好奇,這兩種聲明方式到底有什么區別?最大不同點是使用#define指令來定義常量后,會在程序編譯時,直接將程序中的所有PI都替換成3.14159;而const常量,本質上可以看作是一個只讀變量,需要指定類型,需要分配內存,有自己的作用域。
■【上機實習范例:CH02_03.c】
01 #include<stdio.h> 02 #include<stdlib.h> 03 04 #define PI 3.14159 /*聲明PI為 3.14159*/ 05 06 int main() 07 { 08 09 const int radius =10; /*聲明圓半徑為整數常量*/ 10 11 printf("PI=%f\n",PI);/* %f為浮點數輸出格式 */ 12 printf("圓的半徑=%d ,面積=%f \n",radius,PI*radius*radius); 13 14 return 0; 15 }
執行結果如圖2.4所示。

圖2.4
程序解說
這個程序的目的是讓各位了解使用符號常量的聲明方法,它們被聲明后在程序中絕對不能再改變,例如,如果在第10行加一行語句const int radius =15,編譯時就會出現錯誤。第12行printf()函數中所用的“%f”也是一種格式化字符,作用是輸出浮點數的數值。
不過有一種情況例外,例如下面這個程序,我們在main()函數中聲明了一個const模式的常量salary,但如果在更小的程序區塊中(利用{})重新聲明一個const模式的常量salary,就可以改變其值,不過離開此區塊后,salary又會恢復為原來的數值。
■【上機實習范例:CH02_04.c】
01 #include<stdio.h> 02 #include<stdlib.h> 03 04 int main(void) 05 { 06 const int salary=23000;/*聲明salary為常量 */ 07 08 printf("salary=%d\n",salary); 09 10 { 11 const int salary=33000; 12 printf("salary=%d\n",salary); 13 }/*在此程序區塊中重新聲明salary常量,可改變其值 */ 14 15 printf("salary=%d\n",salary); 16 17 return 0; 18 }
執行結果如圖2.5所示。

圖2.5
程序解說
我們知道C語言中的程序區塊是由一對大括號括起來的,包含單行或多行程序語句,程序區塊中還可以包含更小的程序區塊,這時每個區塊中所定義的變量或常量就會有生命周期,所以各位會發現在第12、15行中所輸出的salary值并不相同。這部分內容在后面關于函數的章節中會詳細說明。
- 軟件項目估算
- Delphi程序設計基礎:教程、實驗、習題
- JavaScript高效圖形編程
- Python數據可視化:基于Bokeh的可視化繪圖
- Visual Basic編程:從基礎到實踐(第2版)
- Cassandra Data Modeling and Analysis
- Python應用輕松入門
- Backbone.js Blueprints
- Python 3破冰人工智能:從入門到實戰
- Django實戰:Python Web典型模塊與項目開發
- Mastering HTML5 Forms
- 測試架構師修煉之道:從測試工程師到測試架構師
- Python Social Media Analytics
- 金融商業數據分析:基于Python和SAS
- 設計模式之禪