原代碼問題
// ❌ 語法錯誤:C 不支持鏈式比較 c > b > a
if (c > b > a) return c;
// ❌ 邏輯錯誤:僅判斷 c > b > a 一種情況,漏掉其他 5 種排列
正確實現
方案一:逐步比較法(推薦,易讀、通用)
int max(int a, int b, int c) {
int m = a; // 假設 a 最大
if (b > m) m = b; // b 更大則更新
if (c > m) m = c; // c 更大則更新
return m;
}
方案二:標準庫函數(C++/C11)
// C++
#include <algorithm>
int max = std::max({a, b, c});
// C11 可用 fmaxf/fmax 但需嵌套
#include <math.h>
int max = fmax(fmax(a, b), c);
方案三:三元運算符(單行黨)
int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
完整可運行程序
#include <stdio.h>
int max(int a, int b, int c) {
int m = a;
if (b > m) m = b;
if (c > m) m = c;
return m;
}
int main() {
int a, b, c;
printf("請輸入三個整數: ");
scanf("%d %d %d", &a, &b, &c);
printf("最大值是: %d\n", max(a, b, c));
return 0;
}
測試用例
| 輸入 | 輸出 | 說明 |
| 3 5 2 | 5 | 中間最大 |
| 10 1 1 | 10 | 首個最大 |
| -5 -2 -8 | -2 | 負數 |
| 7 7 7 | 7 | 全等 |
擴展:N 個數求最大值
int maxArray(int arr[], int n) {
if (n <= 0) return INT_MIN; // 需 #include
int m = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > m) m = arr[i];
}
return m;
}
總結
- ❌
c > b > a 是**語法錯誤**(C 語言無鏈式比較)且**邏輯不全**
- ✅ **逐步比較法**:
m = a; if(b>m)m=b; if(c>m)m=c; —— 正確、高效、易擴展
- 💡 核心思想:**假設第一個最大,依次挑戰者更新最大值**