首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Xcode中,我在代码片段中发现了语义问题

在Xcode中,我在代码片段中发现了语义问题
EN

Stack Overflow用户
提问于 2018-11-25 17:21:35
回答 4查看 73关注 0票数 2

程序试图编译,但我发现错误显示:“控制可能到达非空函数的末尾”。我猜想在放入返回比较之后如何处理if条件。我一直在想如何解决这个问题。

代码语言:javascript
复制
   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;
  }
EN

回答 4

Stack Overflow用户

发布于 2018-11-25 17:26:23

不应该检测到“控制可能到达非空函数的末尾”,因为实际上没有这种可能性。可能是数据流分析器没有正确检测到这一点。

然而,有一个更好的替代方案来实现它,它也会解决你的问题:

代码语言:javascript
复制
int compare(const void *a, const void *b)
{
  return (*(const int*)b < *(const int*)a) - (*(const int*)a < *(const int*)b);
}

顺便说一句。这段代码的性能更好,因为您不再需要任何分支。

用于演示的小型MCVE:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
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⇒⇒

票数 7
EN

Stack Overflow用户

发布于 2018-11-25 17:25:03

不要在C++中使用C风格的类型转换。

因为您知道您已经涵盖了所有条件,所以最后一个测试是多余的:

代码语言:javascript
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2018-11-25 17:47:17

如果您不知道这些指针后面的对象的实际类型是什么,您可能想要这样做:

代码语言:javascript
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53466152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档