程序试图编译,但我发现错误显示:“控制可能到达非空函数的末尾”。我猜想在放入返回比较之后如何处理if条件。我一直在想如何解决这个问题。
int compare(const void *a, const void *b)
{
if (*(int *)a < *(int *)b)
return -1;
if (*(int *)a == *(int *)b)
return 0;
if (*(int *)a > *(int *)b)
return 1;
}发布于 2018-11-25 17:26:23
不应该检测到“控制可能到达非空函数的末尾”,因为实际上没有这种可能性。可能是数据流分析器没有正确检测到这一点。
然而,有一个更好的替代方案来实现它,它也会解决你的问题:
int compare(const void *a, const void *b)
{
return (*(const int*)b < *(const int*)a) - (*(const int*)a < *(const int*)b);
}顺便说一句。这段代码的性能更好,因为您不再需要任何分支。
用于演示的小型MCVE:
#include <iostream>
int compare(const void *a, const void *b)
{
return (*(const int*)b < *(const int*)a) - (*(const int*)a < *(const int*)b);
}
int main()
{
int a = 1, b = 2;
std::cout << "compare(&a, &b): " << compare(&a, &b) << '\n';
std::cout << "compare(&b, &a): " << compare(&b, &a) << '\n';
std::cout << "compare(&a, &a): " << compare(&a, &a) << '\n';
return 0;
}输出:
compare(&a, &b): -1
compare(&b, &a): 1
compare(&a, &a): 0我必须承认,当我回答这个问题时,有人“强迫”我这么做。
SO: Sorting an array of integers in alternate fashion using qsort function.。
下面是我给出的解释:
它的工作原理:
In case a < b:(a > b) - (a < b) 0 - 1 -1⇒⇒case
In case a == b:(a > b) - (a < b) 0 - 0 0⇒⇒case
In case a > b:(a > b) - (a < b) 1 - 0 1⇒⇒
发布于 2018-11-25 17:25:03
不要在C++中使用C风格的类型转换。
因为您知道您已经涵盖了所有条件,所以最后一个测试是多余的:
int compare(const void *a, const void *b)
{
int a1 = *static_cast<const int *>(a);
int b1 = *static_cast<const int *>(b);
if (a1 < b1)
return -1;
if (a1 == b1)
return 0;
return 1;
}发布于 2018-11-25 17:47:17
如果您不知道这些指针后面的对象的实际类型是什么,您可能想要这样做:
#include <cstring>
int f(const void *a, const void *b)
{
int ai;
int bi;
std::memcpy(&ai, a, sizeof(int));
std::memcpy(&bi, b, sizeof(int));
return (bi < ai) - (ai < bi);
}https://stackoverflow.com/questions/53466152
复制相似问题