函數 fun815 邏輯驗證:計算數組前 n 個元素乘積
代碼
int fun815(int b[], int n) {
static int sum = 0, i; // static 導致多次調用累積,錯誤!
for (i = 0; i < n; i++) sum *= b[i]; // sum 初值 0 → 永遠為 0
return sum;
}
int main() {
int a[] = {2,6,4,5,6,7,8,9};
printf("%d\n", fun815(a, 3)); // 預期 2*6*4=48
return 0;
}
關鍵錯誤
static int sum = 0:靜態局部變量只初始化一次。首次調用 sum=0,乘積永遠為 0;第二次調用保留上次結果 (0),仍為 0。應用自動變量 int sum = 1 (乘法單位元)。
sum *= b[i] 初值 0 → 結果恆 0。乘法初值必須為 1。
- 參數
int b[] 等價 int *b,正確接收數組首地址。
修正版
int product(const int *arr, int n) { // const 防止誤修改
long long prod = 1; // 用長整型延緩溢出
for (int i = 0; i < n; ++i) prod *= arr[i];
return (int)prod; // 或返回 long long
}
int main() {
int a[] = {2,6,4,5,6,7,8,9};
printf("前3項乘積: %d\n", product(a, 3)); // 48
printf("前5項乘積: %d\n", product(a, 5)); // 2*6*4*5*6 = 1440
return 0;
}
進階:溢出檢測與大數乘積
// 返回 0 表示溢出,結果通過指針輸出
int safe_product(const int *arr, int n, long long *result) {
*result = 1;
for (int i = 0; i < n; ++i) {
if (arr[i] != 0 && llabs(*result) > LLONG_MAX / llabs(arr[i])) return 0;
*result *= arr[i];
}
return 1;
}
總結
- 累積變量 (求和/乘積/計數) **不要用 static**,除非有意保持狀態 (如計數器)。
- 乘法單位元是 1,加法是 0。
- 數組作參數退化為指針,
int b[] / int *b / int b[10] 在參數列表中完全等價。