主函數輸入整數,調用子函數計算絕對值,主函數輸出結果。
#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.h | int | int | 整數絕對值 |
labs() | stdlib.h | long | long | 長整數 |
llabs() | stdlib.h | long long | long long | 長長整數 (C99) |
fabs() | math.h | double | double | 浮點數 |
fabsf() | math.h | float | float | 單精度 (C99) |
fabsl() | math.h | long double | long 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