泛型比较
本课属于 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,按升序对整数数组进行排序。
挑战
简单编写一个函数 compare_ints,按照 qsort 等通用算法使用的标准比较函数约定,对两个整数进行比较。
你的函数应比较这两个值,并返回一个表示它们大小关系的结果。
返回值约定:
- 如果第一个整数小于第二个整数(first < second),返回负数
- 如果两个整数相等,返回零
- 如果第一个整数大于第二个整数(first > second),返回正数
参数:
a(int):要比较的第一个整数b(int):要比较的第二个整数
返回值:一个表示大小关系的整数:如果 a < b,则为负数;如果 a == b,则为零;如果 a > b,则为正数。
提示:本课介绍的减法技巧可以得出一个简洁优雅的单行答案。
亲手试试
int compare_ints(int a, int b) {
// 在这里编写代码
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器