根據輸入的 x 計算 y:
x < 1 時,y = x1 ≤ x < 10 時,y = 2x - 1x ≥ 10 時,y = 3x - 11#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) { ... } | 可讀性強、自文檔化、易維護 | 多一次邏輯判斷(極微小開銷) |
可能原因:
x >= 1 && x < 10 放在 x < 1 之前,會導致 x < 1 永遠不被執行else if x >= 1 && x < 10 缺少括號,編譯錯誤else if (...); { ... } 導致空語句,本體無條件執行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);
}
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 計算 | 結果 |
|---|---|---|---|
| -5 | x < 1 | y = -5 | -5 |
| 0 | x < 1 | y = 0 | 0 |
| 1 | 1 ≤ x < 10 | y = 2×1 - 1 | 1 |
| 5 | 1 ≤ x < 10 | y = 2×5 - 1 | 9 |
| 9 | 1 ≤ x < 10 | y = 2×9 - 1 | 17 |
| 10 | x ≥ 10 | y = 3×10 - 11 | 19 |
| 100 | x ≥ 10 | y = 3×100 - 11 | 289 |
else { 錯誤處理 } 捕捉邏輯漏洞