如果我们不从 std::qsort 返回 0 会发生什么?

Zeb*_*ish 2 c++ std qsort

根据文档 qsort 应该像这样使用:

std::qsort(a, size, sizeof *a, [](const void* a, const void* b)
    {

        if(*a < *b) return -1;
        if(*a> *a) return 1;
        return 0;
    });
Run Code Online (Sandbox Code Playgroud)

如果值相同并且我不介意哪个先出现,或者我更喜欢基于其他变量的一个在另一个之前,我可以这样做吗?

if(*a < *b) return -1;
else return 1;
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 6

根据C11标准(7.22.5/4),

当相同的对象(由size字节组成,不管它们在数组中的当前位置)被多次传递给比较函数时,结果应彼此一致。也就是说,因为qsort它们应该在数组上定义一个总排序,并且对于bsearch同一个对象应该总是以相同的方式与键进行比较。

您的比较函数违反了此要求,因为只要两个值相等,它就会返回 1。当qsort比较两个相等的值x,并y使用比较函数,它将返回1,告诉qsortx > y。如果稍后比较yand x,则比较函数将再次返回 1,这意味着y > x。这两个结果彼此不一致。

此要求通过引用并入 C++17 ([alg.c.library]/2)。因为违反了要求,所以行为是未定义的。