【在主畫面加入捷徑】
       
【選擇語系】
繁中 简中

[C 語言] 程式設計教學:變數 (variable) 和資料型別 (data type)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
【贊助商連結】

    程式很大一部分的目的在操作資料 (data),變數 (variable) 和資料型別 (data type) 是程式中用來處理資料的基礎概念。

    宣告和使用變數 (Variable)

    使用變數的目的給資料一個識別字 (identifier),待後續程式來呼叫。精確一點來說,電腦程式調用的資料會存在記憶體中,而變數會指向這塊記憶體,但使用者不需去了解內部的技術細節。以下是一個簡例:

    #include <stdio.h>
    
    int main(void)
    {
        // Declare a variable and assign some value.
        char *msg = "Hello World";
        
        // Print the string to console.
        printf("%s\n", msg);
        
        return 0;
    }
    

    在我們這個例子中,我們宣告變數 msg 並對其賦值,接著,我們在 printf 函式中呼叫 msg 變數,最後在終端機印出其值。

    變數包含以下三個要素:

    • 變數的識別字 (identifier)
    • 變數的資料型別 (data type)
    • 變數的值 (value)

    宣告變數及賦值的虛擬碼如下:

    type varName = value;
    

    對照我們的例子:

    char *msg = "Hello World";

    對照變數的要素如下:

    • 變數名稱:msg
    • 資料型別:char *,為指向 char 的指標 (pointer)
    • 值:"Hello World"

    指標是 C (或 C++) 重要的語法特性,和操作記憶體相關,但我們這裡暫時不談其細節。

    設置識別字

    變數名稱可以用以下符號開頭:

    • 英文字母 (大小寫均可)
    • 底線 _

    除了開頭外,可以用以下符號:

    • 英文字母 (大小寫均可)
    • 底線 _
    • 數字

    只要符合規則,任何變數名稱皆可。一開始學習時,通常會用很簡單的符號來命名變數,這倒也無可厚非。但最好將變數以有意義的方式來命名,日後閱讀程式碼時比較能理解其想法。

    像以下的程式一開始無上馬上會意其意圖:

    n = a * pow((1.0 + r), p);

    但我們將變數改一下,馬上就可以知道該程式碼的意圖:

    total = principal * pow((1.0 + rate), numOfPeriods);

    而迴圈 (loop) 內通常會用 ij 等簡短的變數名稱,因為這類變數只是一個暫時的計數器 (counter),如下例:

    for (size_t i = 0; i < row; i++) {
        for (size_t j = 0; j < col; j++) {
            // Do something here.
        }
    }

    函式 (function) 內部的變數名稱可以視情形用長變數或短變數,清晰可辨即可:

    stack_t * stack_new()
    {
        stack_t *s = (stack_t *) malloc(sizeof(stack_t));
        if (!s)
            return s;
        
        s->top = NULL;
        
        return s;
    }

    在本例中,由上下文可知 s 的型別為 stack_t *,故使用短變數也無妨。

    變數命名風格

    一般來說,變數命名有以下數種風格:

    • PascalCase (大駝峰命名法)
    • camelCase (小駝峰命名法)
    • snake_case (蛇形命名法)

    C 編譯器沒有限定變數命名的風格。筆者採用 snake_case 來命名變數。至於 CamelCase (大駝峰) 僅用於定義新的結構 (struct),這是因為我們可以將結構視為類似於類別 (class) 的實體,後文會再說明。

    保留字 (Keywords)

    保留字是指在程式語言中有特殊意義,無法做為變數的字詞。C 語言有以下 44 個保留字:

    auto	break	case	char
    const	continue	default	do
    double	else	enum	extern
    float	for	goto	if
    int	long	register	return
    short	signed	sizeof	static
    struct	switch	typedef	union
    unsigned	void	volatile	while
    _Alignas    _Alignof    _Atomic _Bool
    _Complex    _Generic    _Imaginary  _Noreturn
    _Static_asssert _Thread_local
    

    不需要去背誦保留字,也不用刻意去記每個保留字的意義,在學習程式設計的過程中自然會記住,此外,編輯器或 IDE 會將保留字加色,在視覺上很容易區別。

    註:這項編輯器的特性稱為語法高亮 (syntax highlighting)。

    資料型別 (Data Type)

    大部分主流的語言都有資料型別的特性,資料型別可用來規範資料允許的操作,像數字可以進行加減乘除等代數運算,但字串則否。

    在資料型別中,基礎型別視為單一的值,C 語言有以下基礎型別:

    • 布林數 (boolean) (搭配 stdbool.h 函式庫) (C99)
      • bool (或 _Bool)
    • 字元 (character)
      • char
      • unsigned char
      • signed char
    • 整數 (integer)
      • 帶號 (signed) 整數
        • short
        • int
        • long
        • long long (C99)
      • 無號 (unsigned) 整數
        • unsigned short
        • unsigned int
        • unsigned long
        • unsigned long long (C99)
    • 浮點數 (floating-point number)
      • float:6 位精確度
      • double:15 位精確度
      • long double:19 位精確度
    • 複數 (complex) (搭配 complex.h 函式庫) (C99)
      • float complex (或 float _Complex)
      • double complex (或 double _Complex)
      • long double complex (或 long double _Complex)

    C 有多種數字型別,不同數字型別的範圍不等,有時是為了節省資源,能用 short 時就不會用 int。不過,一開始學習時,不需那麼斤斤計較,整數用 int,浮點數用 double 即可。

    C 語言的數字的範圍會受到系統的影響,而非固定的值,stdint.h (C99) 定義了一系列有精確範圍的整數,若程式有這方面的需求,可引用此函式庫。

    C 語言沒有獨立的字串 (string) 類別,是用字元陣列來儲存字串,我們將於後文說明。

    void 是一個特殊型別,用於函式宣告、void 運算式、指向 void 的指標等。

    enum 是用來定義僅有少數值的型別,像是一個星期只會有七種日期 (day of week),一年中只有十二種月份。

    除了上述型別,C 還有以下衍生型別:

    • 陣列 (array)
    • 結構 (struct)
    • 聯合 (union)
    • 指標 (pointer)
    • 函式 (function)

    我們將衍生類別留在後文說明。

    【贊助商連結】
    【贊助商連結】
    【分類瀏覽】