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

C語言求絕對值函數實現:三種方法對比與標準庫使用

     編輯:C 語言問答

題目需求

主函數輸入整數,調用子函數計算絕對值,主函數輸出結果。

方法一:自定義函數(教學標準答案)

#include <stdio.h>

// 函數聲明
int my_abs(int x);

int main() {
    int n;
    printf("請輸入一個整數: ");
    scanf("%d", &n);
    
    int result = my_abs(n);
    printf("絕對值: %d\n", result);
    return 0;
}

// 函數定義
int my_abs(int x) {
    if (x < 0) 
        return -x;
    else 
        return x;
    // 或簡寫:return (x < 0) ? -x : x;
}

方法二:使用標準庫 <stdlib.h> abs()

#include <stdio.h>
#include <stdlib.h>  // abs() 在此處

int main() {
    int n;
    scanf("%d", &n);
    printf("絕對值: %d\n", abs(n));
    return 0;
}

方法三:使用 <math.h> fabs() (浮點數)

#include <stdio.h>
#include <math.h>

int main() {
    double x;
    scanf("%lf", &x);
    printf("絕對值: %.2f\n", fabs(x));
    // 編譯需鏈接數學庫:gcc -lm main.c
    return 0;
}

關鍵知識點

函數頭文件參數類型返回類型適用場景
abs()stdlib.hintint整數絕對值
labs()stdlib.hlonglong長整數
llabs()stdlib.hlong longlong long長長整數 (C99)
fabs()math.hdoubledouble浮點數
fabsf()math.hfloatfloat單精度 (C99)
fabsl()math.hlong doublelong double長雙精度 (C99)

邊界情況:最小值陷阱

⚠️ 未定義行為警告

對於有符號整數,INT_MIN (如 -2147483648) 的絕對值 無法用同類型表示 (最大值 2147483647)。

// 錯誤示範
int n = -2147483648;  // INT_MIN
printf("%d\n", abs(n));  // 未定義行為!可能仍輸出負數

// 安全寫法
long long n = -2147483648LL;
printf("%lld\n", llabs(n));  // 正確輸出 2147483648

位運算技巧 (無分支,高性能)

// 假設 int 32位,利用算術右移特性
int abs_bitwise(int x) {
    int mask = x >> 31;  // 負數全1(0xFFFFFFFF),非負全0
    return (x ^ mask) - mask;
    // 等價於:(x + mask) ^ mask
}

完整可運行示例 (含輸入驗證)

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int safe_abs(int x) {
    if (x == INT_MIN) {
        fprintf(stderr, "警告: INT_MIN 絕對值溢出,返回長整數\n");
        return INT_MAX;  // 或返回錯誤碼
    }
    return (x < 0) ? -x : x;
}

int main() {
    int n;
    printf("輸入整數 (範圍 %d ~ %d): ", INT_MIN, INT_MAX);
    if (scanf("%d", &n) != 1) {
        printf("輸入無效\n");
        return 1;
    }
    
    int result = safe_abs(n);
    printf("|%d| = %d\n", n, result);
    
    // 對比標準庫
    printf("std::abs(%d) = %d\n", n, abs(n));
    return 0;
}

編譯與運行

# 基本編譯
gcc abs_demo.c -o abs_demo

# 使用 math.h 需鏈接數學庫
gcc abs_float.c -o abs_float -lm

# 運行
./abs_demo
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved