C語言 if 陳述式處理多重條件|邏輯運算子與巢狀技巧

目次

1. 前言

C語言中的條件分支是控制程式流程的重要要素。其中 if 敘述是依條件執行不同處理的基本結構。然而,在實際程式中,常常需要「不僅僅是一個條件,而是結合多個條件」的情況。 例如,考慮以下情況。
範例: 「變數 a 大於等於 10,且 b 小於 5 時執行處理」
在這種情況下,C語言可以使用邏輯運算子(&&, ||)與巢狀(if 的嵌套)來結合條件。本文將詳細說明在 C 語言的 if 敘述中處理多重條件的方法,從基礎到應用

2. C語言的if語句基礎

2.1. if語句的基本結構

在C語言中,if語句在指定條件為真(true)時,執行特定的處理。
if (条件) {
    // 条件為真時的處理
}

例:變數 x 大於等於 10 時顯示訊息

#include <stdio.h>

int main() {
    int x = 15;

    if (x >= 10) {
        printf("x是10以上。\n");
    }

    return 0;
}

2.2. if-else語句的基本結構

if語句加入else,即可描述條件為偽(false)時的處理。
if (条件) {
    // 条件為真時的處理
} else {
    // 条件為偽時的處理
}

例:判斷使用者輸入的數值是否為正數

#include <stdio.h>

int main() {
    int num;
    printf("請輸入整數: ");
    scanf("%d", &num);

    if (num > 0) {
        printf("輸入的數字是正數。\n");
    } else {
        printf("輸入的數字不是正數。\n");
    }

    return 0;
}

2.3. if-else if-else語句的基本結構

若要檢查多個條件,請使用else if
if (条件1) {
    // 条件1為真時的處理
} else if (条件2) {
    // 条件2為真時的處理
} else {
    // 所有條件皆為偽時的處理
}

例:根據輸入的分數顯示成績

#include <stdio.h>

int main() {
    int score;
    printf("請輸入分數: ");
    scanf("%d", &score);

    if (score >= 80) {
        printf("成績: A\n");
    } else if (score >= 60) {
        printf("成績: B\n");
    } else {
        printf("成績: C\n");
    }

    return 0;
}

3. 使用 if 語句處理多個條件的方法

3.1. 邏輯運算子(&&, ||)的使用

C語言中,可以使用 &&(AND運算子)或 ||(OR運算子)來組合多個條件。 ✅ &&(AND 運算子)
  • 所有條件皆滿足時執行
#include <stdio.h>

int main() {
    int a = 15, b = 3;

    if (a > 10 && b < 5) {
        printf("a大於10,b小於5。
");
    }

    return 0;
}
||(OR 運算子)
  • 只要任一條件滿足即執行
#include <stdio.h>

int main() {
    int a = 8, b = 3;

    if (a > 10 || b < 5) {
        printf("a大於10,或b小於5。
");
    }

    return 0;
}
!(NOT 運算子)
  • 將條件取反
#include <stdio.h>

int main() {
    int a = 8;

    if (!(a > 10)) {
        printf("a小於等於10。
");
    }

    return 0;
}

3.2. if語句的巢狀(嵌套)

  • if 語句中嵌入 if 語句,可實現更細緻的條件分支

範例:檢查年齡與身高兩者

#include <stdio.h>

int main() {
    int age = 20, height = 170;

    if (age >= 18) {
        if (height >= 160) {
            printf("已成年,且身高 160cm 以上。
");
        } else {
            printf("已成年,但身高低於 160cm。
");
        }
    } else {
        printf("未成年。
");
    }

    return 0;
}

4. 處理多重條件時的最佳實踐

4.1. 提升可讀性

4.1.1. 拆分條件式

int isEligibleForDiscount = (score >= 80);
int isAdult = (age >= 18);
int isMemberValid = (isMember == 1);

if (isEligibleForDiscount && isAdult && isMemberValid) {
    printf("您是優惠對象。\n");
}

4.1.2. 將條件式函式化

#include <stdio.h>

int isEligible(int score, int age, int isMember) {
    return (score >= 80 && age >= 18 && isMember == 1);
}

int main() {
    int score = 85, age = 20, isMember = 1;

    if (isEligible(score, age, isMember)) {
        printf("您是優惠對象。\n");
    } else {
        printf("您不是優惠對象。\n");
    }

    return 0;
}

4.2. 考慮效能

4.2.1. 利用短路評估(Short Circuit)

if (a != 0 && b / a > 1) {
    printf("計算結果: %d\n", b / a);
}

4.2.2. 最佳化評估順序

if (a > 0 && isHeavyCalculation()) {
    printf("執行處理\n");
}

4.3. 提升可維護性

4.3.1. 注意條件式的易讀性

if (user.age >= 18 && user.score >= 50) {
    printf("條件已滿足。\n");
}

4.3.2. 避免使用魔法數字

#define ADULT_AGE 18

if (age >= ADULT_AGE) {
    printf("已成年。\n");
}

5. 實作範例:使用 if 敘述的程式

5.1. 顯示依使用者年齡的訊息

#include <stdio.h>

int main() {
    int age;

    printf("請輸入年齡: ");
    scanf("%d", &age);

    if (age >= 18 && age < 65) {
        printf("您是成年人。
");
    } else if (age >= 65) {
        printf("您是年長者。
");
    } else {
        printf("您是未成年人。
");
    }

    return 0;
}

5.2. 簡易登入驗證程式

#include <stdio.h>
#include <string.h>

int main() {
    char username[20];
    char password[20];

    printf("使用者名稱: ");
    scanf("%s", username);

    printf("密碼: ");
    scanf("%s", password);

    if (strcmp(username, "admin") == 0 && strcmp(password, "1234") == 0) {
        printf("登入成功!
");
    } else {
        printf("登入失敗...
");
    }

    return 0;
}

5.3. 三角形判斷程式

#include <stdio.h>

int main() {
    int a, b, c;

    printf("請輸入三角形的三邊長度: ");
    scanf("%d %d %d", &a, &b, &c);

    if (a == b && b == c) {
        printf("等邊三角形。
");
    } else if (a == b || b == c || a == c) {
        printf("等腰三角形。
");
    } else {
        printf("不等邊三角形。
");
    }

    return 0;
}

5.4. 數值範圍檢查

#include <stdio.h>

int main() {
    int number;

    printf("請輸入數值: ");
    scanf("%d", &number);

    if (number >= 50 && number <= 100) {
        printf("數值適當。
");
    } else {
        printf("超出範圍。
");
    }

    return 0;
}

6. FAQ(常見問題)

6.1. if語句與switch語句該使用哪個?

適合使用 if 語句的情況

  • 需要範圍(大小比較)時
  • 使用複雜的邏輯式時
if (score >= 90) {
    printf("成績: A
");
} else if (score >= 80) {
    printf("成績: B
");
} else {
    printf("成績: C
");
}

適合使用 switch 語句的情況

  • 判斷特定值(整數或字元)時
switch (grade) {
    case 'A':
        printf("優秀。
");
        break;
    case 'B':
        printf("良好成績。
");
        break;
    default:
        printf("無效的評價。
");
}

6.2. if的巢狀結構與邏輯運算子該使用哪個?

使用巢狀時

if (age >= 18) {
    if (hasID) {
        printf("可以入場。
");
    } else {
        printf("需要身分證。
");
    }
}

使用邏輯運算子時

if (age >= 18 && hasID) {
    printf("可以入場。
");
}

6.3. 簡化 if 條件的寫法

使用三元運算子

int result = (a > 10) ? 1 : 0;

將條件函式化

int isAdult(int age) {
    return age >= 18;
}

if (isAdult(age)) {
    printf("已成年。
");
}

6.4. if 條件錯誤導致無法運作的原因

=(賦值運算子)與 ==(比較運算子)的混淆

if (x == 5) {
    printf("x 為 5。
");
}

明確條件的優先順序

if ((a > 10 && b < 5) || c == 3) {
    printf("條件成立
");
}

浮點數比較

#include <math.h>

if (fabs(a - b) < 0.0001) {
    printf("a 與 b 幾乎相等。
");
}

7. 總結

7.1. if語句的基本結構

if (条件) {
    // 條件為真時的處理
} else {
    // 條件為偽時的處理
}

7.2. 在if語句中處理多個條件的方法

論理運算子的活用

if (age >= 18 && hasID) {
    printf("可以入場。\n");
}

巢狀的活用

if (age >= 18) {
    if (hasID) {
        printf("可以入場。\n");
    } else {
        printf("需要身分證。\n");
    }
}

7.3. 考慮可讀性與效能的寫法

將條件函式化

int isEligible(int score, int age) {
    return (score >= 80 && age >= 18);
}

if (isEligible(85, 20)) {
    printf("符合優惠條件。\n");
}

短路評估的活用

if (a != 0 && b / a > 1) {
    printf("計算結果: %d\n", b / a);
}

7.4. 實踐性的活用範例

if (age >= 18 && age < 65) {
    printf("已成年。\n");
}
if (strcmp(username, "admin") == 0 && strcmp(password, "1234") == 0) {
    printf("登入成功!\n");
}
if (number >= 50 && number <= 100) {
    printf("數值適當。\n");
}

7.5. 常見錯誤與對策

if (x == 5) {
    printf("x 為 5。\n");
}
if ((a > 10 && b < 5) || c == 3) {
    printf("條件成立\n");
}
#include <math.h>

if (fabs(a - b) < 0.0001) {
    printf("a 與 b 幾乎相等。\n");
}

7.6. 本文的總括

✅ 掌握 C 語言的 if 語句,程式控制會更靈活! ✅ 多條件組合時,適當使用論理運算子與巢狀結構! ✅ 注重可讀性與效能,進行程式碼最佳化! ✅ 透過實踐範例,防止錯誤並正確撰寫!

7.7. 未來的學習方向

未來,透過學習更高階的控制結構(switch 語句、while 迴圈等)以及函式的活用,將能製作更具彈性的程式。磨練 C 語言的技能,朝向更好的程式設計邁進!
侍エンジニア塾