-2

我对test函数的结果感到困惑,-1如下所示。

#include <stdio.h>
int test(const void*, const void*);
int main()
{
    int a = 10, b = 5;
    int result = test(&a, &b);
    printf("Result: %d", result);
    return 0;
}

int test(const void* a, const void* b) {
    const double* da = (const double*)a;
    const double* db = (const double*)b;
    return (*da > * db) - (*da < *db);
}

0x0135fb00now 是我的 da 值和 a 的地址
0x0135faf4现在是我的 db 值和 b 的地址

据我所知,如果为真,则关系运算符返回 1,如果为假,则返回 0,所以在这种情况下,我们应该:

*da > *db --> 1
因为da(a 的地址)的值大于db(b 的地址)的值。
*da < *db --> 0
因为da(a 的地址)的值不小于db(b 的地址)的值。
所以 1-0 是 1。
只是为了说明,我通过调试器比较 da 的值和 db 的值得出了这个结论(我使用 Visual Studio 和默认的 C 编译器)。我错过了什么?
PS:我在GNU 官方网站上遇到过这段代码。

4

1 回答 1

0

在你的问题中,你说:

*da > *db --> 1

因为 da 的值(a 的地址)大于 db 的值(b 的地址)。

但是,当您取消引用指针(使用*运算符)时,上面的语句改为测试da 指向的对象是否大于db 指向的对象。

如果您确实想比较地址,请忽略*, 即:

(da > db) - (da < db)

如果您的最终目标是比较地址,则无需转换void指针,因此您可以重写test如下:

int test(const void *a, const void *b) {
    return (a > b) - (a < b);
}
于 2021-12-28T18:15:55.343 回答