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

C語言矩陣操作:尋找絕對值最大元素(fabs vs abs 陷阱)

     編輯:關於C語言

問題描述

輸入 n×m 整數矩陣,找出絕對值最大的元素,輸出其 1-based 行列索引及原始值。多組測試至 EOF。

關鍵陷阱:abs() vs fabs()

  • abs(int) 定義於 <stdlib.h>,參數與返回值均為 int。
  • fabs(double) 定義於 <math.h>,參數與返回值為 double。
  • 錯誤現象:對 int 調用 fabs() 會隱式轉換為 double,比較時 fabs(int) > fabs(int) 正常;但若直接賦值給 int max 會截斷小數部分(此處無影響)。真正問題在於 未包含 math.h 時 fabs 隱式聲明為返回 int,導致錯誤鏈接或運行時錯誤。GCC 編譯嚴格要求顯式聲明,G++ 隱式包含 C++ 標準庫較寬鬆。

正確做法

  1. 包含 <math.h> 並用 fabs((double)val),或
  2. 自寫整數絕對值:#define IABS(x) ((x)>=0?(x):-(x)),避免函數調用開銷與類型陷阱。

優化版代碼

#include <stdio.h>
#include <stdlib.h> // for abs(int)

#define IABS(x) ((x) >= 0 ? (x) : -(x))

int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) == 2) {
        int max_val = 0, max_r = 0, max_c = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int val; scanf("%d", &val);
                if (IABS(val) > IABS(max_val)) {
                    max_val = val; max_r = i; max_c = j;
                }
            }
        }
        printf("%d %d %d\n", max_r+1, max_c+1, max_val);
    }
    return 0;
}

進階:單次掃描 + 記錄多個最大值位置

若有多個元素絕對值相等且最大,題目未指定輸出哪個。通常取首次出現(上述代碼行為)。若需全部輸出,可動態記錄位置列表。

編譯器差異總結

場景GCC (C)G++ (C++)
未含 math.h 用 fabs警告:隱式聲明;鏈接錯誤或運行錯誤通常通過(C++ 標準庫可能隱式包含)
含 math.h 用 fabs正常(需 -lm 鏈接)正常
用 abs(int) 含 stdlib.h正常正常(cstdlib)

最佳實踐建議

  • C 代碼嚴格包含對應頭文件:stdlib.h 用 abs,math.h 用 fabs。
  • 整數絕對值優先用宏或內聯函數,避免類型轉換與鏈接依賴。
  • 編譯加 -Wall -Wextra -pedantic 捕獲隱式聲明警告。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved