一文帶你掌握C語言的分支結構

2023-12-01 06:01:37

C語言分支結構詳解

1. if 語句

在本篇部落格文章中,我們將深入探討C語言中的if語句及其相關用法。if語句是一種用於條件判斷的分支語句,它允許我們根據條件的真假來執行不同的程式碼塊。

1.1 if 語句的基本語法和用法

if語句的基本語法如下所示:

if (條件) {
    // 條件為真時執行的程式碼塊
}

在這個語法結構中,條件是一個布林表示式,如果條件的值為真(非零),則執行if語句塊中的程式碼。

1.2 else 語句和 else if 語句的使用

除了 if 語句,我們還可以使用 else 語句和 else if 語句來處理條件的不同情況。else 語句在 if 條件以及 else if 條件(假設存在)均為假時執行,而 else if 語句用於在多個條件之間進行判斷。

ifelse if 均需條件,從 if 往下遍歷條件,若所有條件不符合,執行 else 後的程式碼。

int num = 10;

if (num > 0) {
    printf("數位是正數\n");
} else if (num < 0) {
    printf("數位是負數\n");
} else {
    printf("數位是 0\n");
}

在這個範例中,我們根據 num 的值輸出不同的結果。如果 num 大於0,我們列印"數位是正數";如果 num 小於0,我們列印"數位是負數";如果 num 等於0(不大於0且不小於0,就是0),因此我們列印"數位是 0"。

1.3 if 語句的巢狀和多重條件判斷

在C語言中,我們可以巢狀if語句,這意味著在一個 if 語句塊內部包含另一個if語句塊。這樣可以實現更復雜的條件判斷邏輯。

int num = 10;

if (num > 0) {
    if (num % 2 == 0) {
        printf("數位是正偶數\n");
    } else {
        printf("數位是正奇數\n");
    }
} else if (num < 0) {
    printf("數位是負數\n");
} else {
    printf("數位是 0\n");
}

在這個範例中,我們首先判斷num是否大於0,如果是,則進一步判斷num是否為偶數或奇數。根據條件的不同,我們輸出相應的結果。

1.4 懸空 else 問題及其解決方法

在C語言中,else 語句總是與最近的 if 語句配對,這就導致了一個被稱為"懸空 else"的問題。當我們有多個巢狀的if語句時,可能會出現 else 語句與我們預期的 if 語句不匹配的情況。

為了解決懸空 else 問題,可以使用花括號(程式碼塊)來明確 if 語句的範圍,從而避免 else 語句與錯誤的 if 語句配對。

首先請看這個範例,初學者可能發現預期的輸出和實際的輸出有出入。

int num = -10;

if (num > 0)
    if (num % 2 == 0)
        printf("數位是正偶數\n");
else
    printf("數位是負數\n");

在這個範例中,初學者會下意識的根據縮排格式來判斷,理所當然的認為上述程式碼列印"數位是負數",實際情況是什麼都不會列印!!!因為else 語句總是與最近的 if 語句配對

我們使用了花括號將 if 語句的範圍明確標記出來,從而避免了懸空 else 問題。

int num = -10;

if (num > 0) {
    if (num % 2 == 0) {
        printf("數位是正偶數\n");
    }
} else {
    printf("數位是負數\n");
}

2. 關係操作符

在本節中,我們將介紹C語言中常用的關係操作符。在C語言中,任何非零值都被視為真(true),而零值被視為假(false)。關係運算子的結果大致上可以認為返回的是 bool 型別的 true 或者 false,但是,嚴格來說是int型別的1(表示真)或0(表示假)。

2.1 關係操作符的種類和用法

C語言中的關係操作符包括以下幾種:

  • ==:等於
  • !=:不等於
  • >:大於
  • <:小於
  • >=:大於等於
  • <=:小於等於

我們可以使用這些操作符在條件判斷中比較兩個值的大小關係。

2.2 關係操作符的返回值型別

關係操作符的返回值型別是布林型別,即 int 型的0或1。當關系成立時,返回1(真),否則返回0(假)。

2.3 關係操作符在條件判斷中的應用

關係操作符常常用於條件判斷語句中,例如 if 語句、while 迴圈等。通過比較兩個值的大小關係,我們可以根據條件的真假來執行不同的程式碼塊。

下面是一個使用關係操作符的範例:

int a = 5, b = 10;

if (a == b) {
    printf("a 與 b 相等\n");
} else if (a < b) {
    printf("a 比 b 小\n");
} else {
    printf("a 比 b 大\n");
}

在這個範例中,我們比較了變數a和b的值,並根據比較結果輸出不同的結果。

3. 條件操作符

條件操作符(也稱為三元運運算元、三目運運算元)是C語言中一種簡潔的條件表示式。它允許我們根據條件的真假選擇不同的值。

3.1 條件操作符的語法和用法

條件操作符的語法如下所示:

條件 ? 表示式1 : 表示式2

如果條件為真,則返回表示式1的值;如果條件為假,則返回表示式2的值。

通常來講,是可以支援多條三元運算巢狀的,然而在我看來這並不是寫程式碼的良好習慣,可讀性太差!

3.2 條件操作符與if語句的對比

條件操作符提供了一種簡潔的條件判斷方式,它可以替代簡單的 if 語句。使用條件操作符可以使程式碼更加簡潔和易讀。

下面是一個使用條件操作符的範例:

int age = 18;
char* result = (age >= 18) ? "你是成年人" : "你是未成年";

printf("%s\n", result);

在這個範例中,我們根據年齡的值選擇不同的結果。如果年齡大於等於18歲,我們輸出"你是成年人";否則,我們輸出"你是未成年"。

4. 邏輯操作符

邏輯操作符用於在條件判斷中組合多個條件,並根據邏輯關係的真假進行邏輯運算。

4.1 邏輯操作符的種類和用法

C語言中常用的邏輯操作符包括以下幾種:

  • &&:邏輯與(AND)
  • ||:邏輯或(OR)
  • !:邏輯非(NOT)

邏輯與操作符(&&)在兩個條件都為真時返回真,邏輯或操作符(||)在兩個條件中至少一個為真時返回真,邏輯非操作符(!)用於取反。

4.2 邏輯操作符的短路運算特性

邏輯操作符具有短路運算的特性,即在某個條件已經確定的情況下,將不再計算後續的條件。

下面是一個邏輯操作符短路運算的範例:

int num = 10;

if (num > 0 && num < 100) {
    printf("Number is between 0 and 100\n");
}

在這個範例中,如果 num 大於0,才會繼續判斷 num 是否小於100。如果 num 小於等於0,後續的條件判斷將被短路,不再執行。

邏輯與:左假則右不執行,因為一假則假,既然都是假的了,何必浪費時間往右繼續判斷?

邏輯或:左真則右不執行,因為一真則真,既然都是真的了,那就不用在繼續判斷啦!

5. switch 語句

現在,讓我們來探討C語言中另一個重要的分支語句:switch 語句。

5.1 switch 語句的基本語法和用法

switch 語句是一種用於多分支選擇的語句,它根據表示式的值選擇不同的執行路徑。

switch 語句的基本語法如下所示:

switch (表示式) {
    case 值1:
        // 執行語句塊1
        break;
    case 值2:
        // 執行語句塊2
        break;
    ...
    default:
        // 預設執行語句塊
        break;
}

在這個語法結構中,表示式的值將與每個 case 的值進行比較,如果匹配,則執行相應的語句塊。如果沒有匹配的 case,則執行 default 語句塊(可選)。

下面是一個使用 switch 語句的範例:

int choice = 2;

switch (choice) {
    case 1:
        printf("You chose option 1\n");
        break;
    case 2:
        printf("You chose option 2\n");
        break;
    case 3:
        printf("You chose option 3\n");
        break;
    default:
        printf("Invalid choice\n");
        break;
}

在這個範例中,根據變數choice的值,我們選擇不同的選單項進行輸出。

5.2 switch語句中的執行順序問題

在 switch 語句中,case 的執行順序是從上到下的,即匹配到的第一個 case 執行後,會繼續執行後續的 case 語句塊,直到遇到 break 語句或 switch 語句結束。

如果在 case 語句塊中沒有使用 break 語句,將會發生case穿透現象,即執行完一個case後,會繼續執行下一個case語句塊,直到遇到break語句或switch語句結束。

下面是一個"case穿透"的範例:

int num = 2;

switch (num) {
    case 1:
        printf("Number is 1\n");
    case 2:
        printf("Number is 2\n");
    case 3:
        printf("Number is 3\n");
    default:
        printf("Invalid number\n");
}

在這個範例中,如果num的值為2,將會輸出"Number is 2"、"Number is 3"和"Invalid number"。這是因為沒有在每個case語句塊中使用break語句,導致執行順序繼續向下執行。

為了避免case穿透問題,我們可以在每個case語句塊的末尾新增break語句,或者使用合適的控制流語句(如if語句)來控制執行流程。

5.3 switch語句的應用場景

switch語句在實際應用中非常常見,特別適用於根據不同的選擇執行不同的操作。

例如,在選單選擇、狀態機等場景中,我們可以使用switch語句來處理多個固定的選項。

下面是一個使用switch語句的範例:

int choice;

printf("Please enter your choice (1-3): ");
scanf("%d", &choice);

switch (choice) {
    case 1:
        printf("You chose option 1\n");
        break;
    case 2:
        printf("You chose option 2\n");
        break;
    case 3:
        printf("You chose option 3\n");
        break;
    default:
        printf("Invalid choice\n");
        break;
}

在這個範例中,根據使用者輸入的choice值,我們選擇不同的選單項進行輸出。

5.4 switch 語句與 if 語句比較

Switch語句 If語句
用途 多分支選擇,適用於固定值的比較 複雜條件判斷,適用於靈活的條件邏輯
匹配方式 根據表示式的值與case值進行匹配 根據條件表示式的真假進行匹配
執行順序 從匹配到的case開始執行,直到遇到break語句或switch結束 從上到下依次執行,根據條件的真假執行相應的程式碼塊
預設執行 可選的default語句塊在沒有匹配的case時執行 可選的else語句塊在條件為假時執行
程式碼結構 可以將多個選項組織在一起,結構清晰 適用於靈活的條件判斷,程式碼結構較自由
使用場景 處理多個固定選項的選擇 處理複雜的條件邏輯,需要靈活的條件判斷
範例 根據選單選項執行不同的操作 根據年齡和性別判斷是否滿足某個條件