Menu
CoddyTech

泛型比较

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 52 课,共 61 课。

C 标准库中的 qsort 和 bsearch 等通用函数需要一种在不知道元素类型的情况下比较元素的方法。解决办法是使用比较函数:这是你编写的函数,通用算法每当需要比较两个元素时都会调用它。

比较函数的标准签名是:

int compare(const void* a, const void* b);

两个参数都是 const void*,因为通用函数不知道你要排序的数据类型。返回值遵循特定约定:

返回值含义
负数a 排在 b 前面
零a 等于 b
正数a 排在 b 后面

在比较函数中,你将 void* 指针转换为实际类型,然后比较这些值。下面是比较整数的方法:

int compare_ints(const void* a, const void* b) {
    int val_a = *(const int*)a;
    int val_b = *(const int*)b;
    return val_a - val_b;
}

对于整数,减法技巧效果很好:如果 a 较小,结果为负数;如果相等,结果为零;如果较大,结果为正数。现在可以将这个函数传递给 qsort,按升序对整数数组进行排序。

challenge icon

挑战

简单
编写一个函数 compare_ints,按照 qsort 等通用算法使用的标准比较函数约定,对两个整数进行比较。

你的函数应比较这两个值,并返回一个表示它们大小关系的结果。

返回值约定:

  • 如果第一个整数小于第二个整数(first < second),返回负数
  • 如果两个整数相等,返回零
  • 如果第一个整数大于第二个整数(first > second),返回正数

参数:

  • a(int):要比较的第一个整数
  • b(int):要比较的第二个整数

返回值:一个表示大小关系的整数:如果 a < b,则为负数;如果 a == b,则为零;如果 a > b,则为正数。

提示:本课介绍的减法技巧可以得出一个简洁优雅的单行答案。

亲手试试

int compare_ints(int a, int b) {
    // 在这里编写代码
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C 在线编译器