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

PUBLISHED ON JUN 14, 2018 — PROGRAMMING

程式很大一部分的目的在操作資料,變數和資料型別是最基礎的相關概念。

變數 (Variable)

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

#include <stdio.h>

int main(void) {
    // Declare a variable and assign some value.
    char *msg = "Hello World";
    
    // Formatted printing.
    printf("%s\n", msg);
    
    return 0;
}

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

變數包含以下三個要素:

  • 變數名稱
  • 資料型別 (data type)
  • 值 (value)

撰寫方式如下:

type varName = value;

對照我們的例子:

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

指標是 C (或 C++) 重要的語法特性,但我們這裡暫時不談其細節。

變數名稱

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

  • 小寫英文字母
  • 大寫英文字母
  • 底線 _

之後可以用以下符號:

  • 小寫英文字母
  • 大寫英文字母
  • 底線 _
  • 數字

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

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

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

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

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

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

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

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

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

在本例中,由上下文可知 sStack *,使用短變數也無妨。

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

  • camelCase
  • snake_case

任一風格皆可,筆者仿 Java 社群的習慣,採用 camelCase (小駝峰) 來命名變數。至於 CamelCase (大駝峰) 僅用於定義新的結構 (struct),這是因為我們可以將結構視為類似於類別 (class) 的實體,後文會再說明。

保留字 (Keywords)

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

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

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

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

資料型別 (Data Type)

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

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

  • 整數 (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
    • double complex
    • long double complex
  • 字元 (character)
    • char
    • unsigned char
    • signed char
  • 布林數 (boolean) (搭配 stdbool.h 函式庫) (C99)
    • bool

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

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

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

void 是一個特殊型別,僅用於函式宣告。

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

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

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

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

comments powered by Disqus