该程序尝试编译,但是我发现错误显示,“控件可能到达非void函数的末尾”。我想如何在将返回比较放在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;
}
答案 0 :(得分:7)
不应检测到“控件可能到达非空函数的末端”,因为实际上没有这种可能性。可能是数据流分析无法正确检测到这一点。
但是,有一种更好的方法可以实现此目的,它也可以解决您的问题:
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.。
这是我在那给的解释:
工作原理:
如果
a < b
:(a > b) - (a < b)
⇒0 - 1
⇒-1
如果
a == b
:(a > b) - (a < b)
⇒0 - 0
⇒0
如果
a > b
:(a > b) - (a < b)
⇒1 - 0
⇒1
答案 1 :(得分:3)
不要在C ++中使用C样式的强制转换。
您知道自己已涵盖所有条件,所以上一次测试是多余的:
<div>
<img src="https://placekitten.com/g/400/500"> Text(1)
</div>
<div>
<img src="https://justifiedgrid.com/wp-content/gallery/life/biking/137646854.jpg"> Text(2)
</div>
<div>
<img src="http://centraltibetanreliefcommittee.org/doh/photo-gallery/good-sliders/MenuCool5/images/image-slider-1.jpg"> Text(3)
</div>
<div>
<img src="https://www.aussiespecialist.com/content/asp/en/sales-resources/image-and-video-galleries/_jcr_content/mainParsys/hero/image.adapt.1663.medium.jpg"> Text(4)
</div>
答案 2 :(得分:0)
如果您不知道这些指针后面的对象的实际类型是什么,您可能需要这样做:
#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);
}
答案 3 :(得分:0)
这里的要点是,编译器无法识别您的条件涵盖了所有可能的情况。 =>如果您的条件都不满足,则该函数将在没有return语句的情况下结束。您应该在此处使用if-else if-else:
if (…) { … }
else if (…) { … }
else { … }
这将帮助编译器更好地理解您的代码。然后您放弃一次条件。
避免分支是一个好主意,通常以牺牲可读性为代价。查看@Scheff的答案。