C 語言程式設計教學:控制結構 (Control Structure)

PUBLISHED ON JUL 4, 2018 — PROGRAMMING

預設情形下,程式執行的順序是由上至下,但我們可以透過控制結構 (control structure) 來改變程式執行的流程,讓程式有基本的判斷能力。本文介紹 C 語言可用的控制結構。

if

if 算是最基礎的選擇結構,由於英文中的 if 的語義相當符合這個情境,幾乎所有的程式語言都保留 if 這個保留字。if 的 C 虛擬碼如下:

if (condition_a) {
    // Do something_a.
} else if (condition_b) {
    // Do something_b.
} else {
    // Do something_c.
}

除了 if 區塊本身是必需的,else ifelse 都是選擇性的。else if 可以多個,而 else 僅有一個,且需放最後。

由於 C 沒有強制空格,else ifelse 可以換行,這種方式很適合搭配註解一起使用:

// Comment_a
if (condition_a) {
    // Do something_a.
}
// Comment_b
else if (condition_b) {
    // Do something_b.
}
// Comment_c.
else {
    // Do something_c.
}

讀者可從中自行選擇喜好的風格。

以下是實例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // Prompt for input.
    printf("Input an integer: ");

    int num;
    // Valid input.
    if (scanf("%d", &num) == 1) {
        if (num % 2 == 0) {
            printf("%d is even\n", num);
        } else {
            printf("%d is odd\n", num);
        }
    }
    // Invalid input.
    else {
        fprintf(stderr, "Invalid input\n");
        return EXIT_FAILURE;
    }
    
    return EXIT_SUCCESS;
}

switch

switch 算是一種小小的語法糖,主要是用來簡化 if 敘述。switch 的 C 虛擬碼如下:

switch (value) {
case a:
    // Do something.
    break;
case b:
case c:
    // Fallthrough.
    // Do something.
    break;
default:
    // Do something.
    break;
}

要注意在 switch 敘述中,若沒寫 break 則會繼續前往下一個條件,這種特性叫做 *fallthrough*。由於這種特性有時會造成 bug,在 Go 等現代語言中將其修改掉了。

以下是實例:

#include <stdio.h>
#include <time.h>

int main(void) {
    // Get the object to `tm *` for current time.
    time_t t = time(NULL);
    struct tm *now = localtime(&t);

    switch (now->tm_wday) {
    case 0:  // Sunday.
    case 6:  // Saturday.
        // Fallthrough.
        printf("Weekend\n");
        break;
    case 5:  // Friday.
        printf("Thank God. It's Friday.\n");
        break;
    case 3:  // Wednesday.
        printf("Hump day\n");
        break;
    default:  // All other days of week.
        printf("Week\n");
        break;
    }

    return 0;
}

讀者目前不用在糾結在時間物件的使用細節,目前就當固定用法即可,學到指標後自然會這種寫法。

while