CC++ & Algorithm

C++绝对值函数 abs

中等34
语言版本:C++Python
概述:用“距离”来理解绝对值,abs函数能帮我们把负数变成正数,就像温度的零下度数去掉负号。

abs 把负数“掐掉”负号 – C++ 绝对值函数入门

你有没有遇到过这样的情况:你和同桌的考试成绩,一个考了92分,一个考了76分。老师要计算“成绩差距”,你会直接做减法 92 - 76 = 16,没问题。但假如问你“76分和92分相差多少分”,如果写成 76 - 92 = -16,得到的却是负数。这时候我们说“差16分”,而不是“差负16分”。距离从来不会为负数,这就是“绝对值”在做的事:去掉数的符号,只保留大小。

在C++编程里,abs 函数就是专门干这个的。不管你给它正数还是负数,它都返回这个数的“正数版本” —— 绝对值。


怎么理解绝对值?用“距离”来想

  • 数轴上的点 5 离原点 0 的距离是 5
  • 数轴上的点 -5 离原点 0 的距离也是 5

所以 abs(5) = 5abs(-5) = 5。绝对值就等于“不带正负号的数值”,永远非负。


abs 怎么用?

1. 写代码前的准备

abs 函数在 C++ 中有两个常见的“头文件”可以引入:

  • #include <cstdlib>(主要用于整数,比如 intlong
  • #include <cmath>(主要用于整数和浮点数,但新版 C++ 推荐用这个)

大多数编译器两种都支持,保险起见,你可以直接写 #include <cmath>

2. 基本用法

#include <iostream>
#include <cmath>       // 提供abs函数(整数/浮点数)
using namespace std;

int main() {
    int scoreDiff = -16;              // 成绩差为负(同桌比你低16分)
    int absDiff = abs(scoreDiff);     // 去掉负号,变成16
    cout << "实际差距: " << absDiff << "分" << endl;

    double temperature = -5.5;        // 零下5.5度
    double absTemp = abs(temperature); // 变成5.5
    cout << "温度的绝对值: " << absTemp << "度" << endl;
    return 0;
}

运行结果:

实际差距: 16分
温度的绝对值: 5.5度

注意:abs 可以同时处理整数和浮点数(double),因为 <cmath> 中有多个重载版本。

3. 其他常见类型

数据类型对应函数(在 <cmath> 中)例子
intabs()abs(-10) → 10
longlabs()labs(-100000L) → 100000
long longllabs()llabs(-9999999999LL)
floatfabsf()fabsf(-3.14f) → 3.14
doublefabs()abs()fabs(-2.718) → 2.718

对于中小学编程,只用 abs()fabs() 就足够了。fabs 专门用于浮点数,需要 #include <cmath>


生活中的例子:用 abs 算零花钱变化

假设你每周零花钱是30元,今天妈妈多给了你8元,变成38元。如果妈妈少给了8元,变成22元。你想知道“变化了多少元”,不管多给还是少给,都只关心“变化大小”,而不是“增加还是减少”。

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int original = 30;                // 原零花钱30元
    int now = 22;                     // 今天只拿到22元
    int change = now - original;      // 变化量 = 22-30 = -8
    int absChange = abs(change);      // 绝对值 = 8
    cout << "零花钱变化了 " << absChange << " 元(不管增还是减)" << endl;
    return 0;
}

运行结果:

零花钱变化了 8 元(不管增还是减)

新手常犯的错误

错误1:忘记包含头文件

// 缺少 #include <cmath>
int main() {
    cout << abs(-5);  // 编译报错:'abs' was not declared
    return 0;
}

解决:在文件开头加上 #include <cmath>

错误2:用 abs 计算浮点数,却只引入了 <cstdlib>

#include <cstdlib>   // 只声明了整数的abs
double x = -3.14;
cout << abs(x);      // 可能只取整部分:输出3(把小数丢了!)

解决:用 fabs(x) 或包含 <cmath> 后直接用 abs(x)(新版C++支持)。

错误3:认为 abs 会改变原变量的值

int a = -10;
abs(a);       // 这样写不会改变a,a还是-10
int b = abs(a);  // 必须把结果赋值给新变量,b才是10

解决abs 返回新值,原变量保持不变。

错误4:取绝对值后溢出(较少遇到,但值得了解)
int 能表示的最小负数是 -2147483648,它的绝对值 2147483648 超出了 int 最大值 2147483647,会导致错误结果。通常不用担心,但尽量不要对 INT_MIN 取绝对值。


完整示例:计算两个城市温度差的绝对值

小明的城市今天最高温8°C,最低温-3°C。小红的城市最高温5°C,最低温-7°C。谁的城市温差更大?

#include <iostream>
#include <cmath>      // abs函数
using namespace std;

int main() {
    int highX = 8;            // 小明城市最高温
    int lowX = -3;            // 小明城市最低温
    int diffX = highX - lowX; // 8 - (-3) = 11
    int absDiffX = abs(diffX);// 已经是正数,但习惯性取绝对值

    int highY = 5;            // 小红城市最高温
    int lowY = -7;            // 小红城市最低温
    int diffY = highY - lowY; // 5 - (-7) = 12
    int absDiffY = abs(diffY);

    cout << "小明城市温差: " << absDiffX << "°C" << endl;
    cout << "小红城市温差: " << absDiffY << "°C" << endl;
    if (absDiffX > absDiffY)
        cout << "小明城市温差更大" << endl;
    else
        cout << "小红城市温差更大" << endl;
    return 0;
}

运行结果:

小明城市温差: 11°C
小红城市温差: 12°C
小红城市温差更大

延伸学习

  • fabs – 专门给浮点数(floatdouble)用的绝对值函数,包含在 <cmath> 中。
  • sqrt – 平方根,比如 sqrt(16) 返回4。
  • pow – 幂运算,比如 pow(2, 3) 返回8(2的3次方)。
  • ceil / floor – 向上取整 / 向下取整,可以配合绝对值一起使用。

如果你想知道更多数学函数,可以在网上搜索“C++ cmath 常用数学函数”。记得多用 abs 来避免负数带来的麻烦,它就像一把“去负号”的小剪刀,帮你把一切距离、差值、变化量都变成正数。

例题精讲

1单选题

在C++中,要使用 abs 函数计算整数的绝对值,应该包含哪个头文件?

A#include <iostream>
B#include <cstdlib>
C#include <string>
D#include <cmath>
2判断题

在C++中,abs(-5) 和 abs(5) 的返回值都是 5。

3填空题
以下程序计算两个整数的差的绝对值,请补全代码。
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    int a = 10, b = -3;
    int diff = ___(a - b);
    cout << diff << endl;
    return 0;
}
4单选题

下列哪个表达式可以正确计算整数 x 的绝对值?

Ax < 0 ? -x : x
Bx > 0 ? -x : x
C-abs(x)
Dabs(x) + 1
5填空题
以下代码输出 -8 的绝对值,请补全。
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    int num = -8;
    int result = ___(num);
    cout << "| -8 | = " << result << endl;
    return 0;
}