首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言分段函數實作:if-else if 邏輯結構與條件判斷詳解

     編輯:C 語言問答

題目需求

根據輸入的 x 計算 y:

  • x < 1 時,y = x
  • 1 ≤ x < 10 時,y = 2x - 1
  • x ≥ 10 時,y = 3x - 11

標準實作:if-else if 階梯結構

#include <stdio.h>

int main() {
    int x, y;

    printf("請輸入 x 的值:");
    if (scanf("%d", &x) != 1) {
        printf("輸入錯誤\n");
        return 1;
    }

    if (x < 1) {
        y = x;
    } else if (x >= 10) {
        y = 3 * x - 11;
    } else {  // 隱含條件:1 <= x < 10
        y = 2 * x - 1;
    }

    printf("y = %d\n", y);
    return 0;
}

使用者嘗試的寫法分析

使用者想將最後的 else 改為 else if ((x >= 1) && (x < 10)),這完全正確,邏輯等價。

兩種寫法對比

寫法程式碼優點缺點
else 兜底else { y = 2*x - 1; }簡潔、無冗餘判斷、效能微優隱含條件需閱讀者推導
明確條件else if (x >= 1 && x < 10) { ... }可讀性強、自文檔化、易維護多一次邏輯判斷(極微小開銷)

為什麼使用者覺得「怎麼不行」?

可能原因:

  1. 條件順序錯誤:若將 x >= 1 && x < 10 放在 x < 1 之前,會導致 x < 1 永遠不被執行
  2. 括號缺失:else if x >= 1 && x < 10 缺少括號,編譯錯誤
  3. 分號誤加:else if (...); { ... } 導致空語句,本體無條件執行
  4. 型別不匹配:x 為 int,條件判斷正常;若為浮點數需注意精度

正確的明確條件寫法

if (x < 1) {
    y = x;
} else if (x >= 10) {
    y = 3 * x - 11;
} else if (x >= 1 && x < 10) {  // 明確寫出條件
    y = 2 * x - 1;
} else {
    // 理論上不會執行到這裡,但防禦性程式設計可保留
    printf("邏輯錯誤:x=%d 不符合任何條件\n", x);
}

進階:switch-case 無法直接處理區間

C 語言 switch 僅支援整數常數標籤,不支援區間判斷。若需用 switch,需轉換:

// 僅適用於已知範圍的整數 x
switch (x < 1 ? 0 : (x >= 10 ? 2 : 1)) {
    case 0: y = x; break;
    case 1: y = 2 * x - 1; break;
    case 2: y = 3 * x - 11; break;
}

但不推薦,可讀性差,if-else if 是處理區間條件的標準做法。

浮點數版本注意事項


double x, y;
printf("請輸入 x:");
scanf("%lf", &x);

if (x < 1.0) {
    y = x;
} else if (x < 10.0) {  // 隱含 x >= 1.0
    y = 2 * x - 1;
} else {  // x >= 10.0
    y = 3 * x - 11;
}
  • 邊界值 1.0、10.0 精確可表示,無精度問題
  • 若邊界為 0.1 等二進制無法精確表示的值,需考慮 fabs(x - 0.1) < EPS

測試用例驗證

x符合條件y 計算結果
-5x < 1y = -5-5
0x < 1y = 00
11 ≤ x < 10y = 2×1 - 11
51 ≤ x < 10y = 2×5 - 19
91 ≤ x < 10y = 2×9 - 117
10x ≥ 10y = 3×10 - 1119
100x ≥ 10y = 3×100 - 11289

學習重點

  • 條件互斥且窮盡:三區間覆蓋全實數域,無重疊、無遺漏
  • 判斷順序:通常按數值大小順序(小→大)或機率高者優先
  • else 兜底 vs 明確條件:團隊規範統一即可,兩者皆正確
  • 防禦性程式設計:最終加 else { 錯誤處理 } 捕捉邏輯漏洞
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved