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

C語言數組乘積函數解析:參數傳遞與循環邏輯驗證

     編輯:C 語言問答

函數 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;
}

關鍵錯誤

  1. static int sum = 0:靜態局部變量只初始化一次。首次調用 sum=0,乘積永遠為 0;第二次調用保留上次結果 (0),仍為 0。應用自動變量 int sum = 1 (乘法單位元)。
  2. sum *= b[i] 初值 0 → 結果恆 0。乘法初值必須為 1。
  3. 參數 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] 在參數列表中完全等價。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved