qsort 函数比较让我困惑

2023-11-23

我看到很多人在 qsort 比较器函数中使用减法。我认为这是错误的,因为在处理这些数字时:int nums[]={-2147483648,1,2,3}; INT_MIN = -2147483648;

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

我写了这个函数来测试:

#include <stdio.h>
#include <limits.h>

int compare (const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}

int main(void)
{
    int a = 1;
    int b = INT_MIN;
    printf("%d %d\n", a,b);
    printf("%d\n",compare((void *)&a,(void *)&b));
    return 0;
}

输出是:

1 -2147483648
-2147483647

but a > b所以输出应该是正数。 我看过很多书都是这样写的。我认为这是错误的;处理时应该这样写int types:

int compare (const void * a, const void * b)
{
    if(*(int *)a < *(int *)b)
        return -1;
    else if(*(int *)a > *(int *)b)
        return 1;
    else 
        return 0;
}

我只是不明白为什么许多书籍和网站都以如此误导性的方式写作。 如果您有不同的看法,请告诉我。


我认为这是错误的

是的,简单的减法可以得到int溢出是未定义的行为应该避免。

return *(int*)a - *(int*)b;  // Potential undefined behavior.

常见的习惯用法是比较两个整数相减。各种编译器都认识到这一点并创建高效且行为良好的代码。保存const-ness也是很好的形式。

const int *ca = a;
const int *cb = b;
return (*ca > *cb) - (*ca < *cb);

为什么许多书籍和网站都以如此误导性的方式写作。

return *a - *b;从概念上讲很容易理解 - 即使它提供了带有极值的错误答案 - 通常学习者代码会忽略边缘条件来理解想法 - “知道”值会never很大.

或者考虑一下复杂性比较long doubles关于 NaN.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qsort 函数比较让我困惑 的相关文章

  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • PDO:MySQL 服务器已消失

    我有一个脚本 每晚都要进行大量的跑腿工作 它使用在循环中执行的 PDO 准备语句 前几个运行良好 但后来我发现它们都失败并出现错误 MySQL 服务器已经消失 我们运行 MySQL 5 0 77 PHP 版本 5 2 12 网站的其余部分运
  • 斜边按钮

    我正在尝试构建如下所示的按钮 我可以使用以下方法完成此操作 after and CSS 三角形 但我无法使用可变高度元素 有什么方法可以实现这一点并保持可变高度吗 Fiddle http jsfiddle net AaP47 2 在这种情况
  • contenteditable div 中子元素的键盘事件?

    我有一个 div 其 contenteditable 属性已设置为 true 如何让子级响应键盘事件 似乎唯一的方法是捕获父 div 中的事件并通过选择 api 找出子 div 有没有更好的办法 更具体地说 我可以将键盘事件处理程序附加到子
  • 如何在 python 中加载 C# dll?

    如何在 python 中加载 c dll 我是否必须在 c 文件中添加一些额外的代码 如在 C 文件中导出 我不想使用 IronPython 我想将一个模块导入Python 套餐 NET 的 Python和Python实现铁蟒现在以同样的方
  • 如何使用 Criteria API 指定悲观锁?

    我正在使用 Criteria API 检索 hibernate 中的对象列表 但是 我需要锁定这些对象 因为同时执行的另一个线程将获取确切的对象 并且在没有悲观锁的情况下只有一个线程会成功 我尝试如下 但它不起作用 List esns se
  • 将工作簿中的每个工作表保存为单独的 CSV 文件

    如何将 Excel 工作簿中的每个工作表分开保存CSV带有宏的文件 我有一个包含多个工作表的 Excel 我正在寻找一个宏 可以将每个工作表保存到单独的CSV comma separated file Excel 不允许您将所有工作表保存到
  • ActionBarSherlock 上的activatedBackgroundIndicator 的自定义背景不起作用

    我在用着动作栏夏洛克我正在尝试定制激活背景指示器行背景的属性 如果我使用最新的android sdk 没有动作栏夏洛克 我可以自定义背景 创建以下样式资源 值 style xml并将其定义为AndroidManifest xml as an
  • 数据表重新初始化 (jQuery)

    当我首先加载页面时 表中没有任何内容 并且数据表未初始化 在添加了一些交互行之后 当添加所有行 使用ajax调用 时 我以这种方式初始化数据表 oTable table dataTable bJQueryUI true bSortClass
  • HTML 属性名称中允许使用哪些字符?

    在 HTML 属性中名称 值对 名称 部分允许使用哪些字符 看着一些共同属性似乎只使用字母 a z 和 A Z 但是还允许使用其他什么字符 也许是数字 0 9 连字符 和句点 有没有规格这个 这取决于你所说的 允许 是什么意思 每个标签都有
  • Apache:如何从网络之外的计算机访问我的网页?

    我想从网络外部的计算机访问我的网页 我们的网络有 192 168 0 1 192 168 0 255 这样的 IP 网络通过本地网关 192 168 0 1 连接到 Internet 并到达 DNS 服务器 193 xxx xxx xxx
  • 确定用户是否拒绝了 CoreLocation 权限

    是否可以以编程方式确定用户已拒绝使用其位置的权限 其次 如果用户拒绝了权限 是否可以重新提示用户 您可以使用以下方式确定您的授权状态authorizationStatus类方法上CLLocationManager 这会返回一个CLAutho
  • 从 C# 调用 python 代码(.py 文件)

    我有一些执行特定任务的 python 代码 我需要从 C 调用此代码 而不将 python 文件转换为 exe 因为整个应用程序是基于 C 构建的 我怎样才能做到这一点 如果你的Python代码可以通过执行铁蟒那么这绝对是正确的选择 它提供
  • Django:如何使用存储的模型实例作为表单选择?

    我有一个模型 本质上只是一个字符串 django db models CharField 只会存储该模型的几个实例 我如何使用这些值作为表单中的选择 为了说明这一点 该模型可以是BlogTopic 我想让用户能够选择一个或多个主题来订阅 我
  • Linux 内核导致 UDP 数据包丢失

    我有一个通过多播发送 UDP 数据包的服务器和一些列出这些多播数据包的客户端 每个数据包的大小固定为1040 Bytes 服务器发送的整个数据大小为3GByte 我的环境如下 1 Gbit 以太网 40 个节点 1 个发送方节点和 39 个
  • Java 中的向下转型

    Java 中允许向上转换 但向下转换会产生编译错误 可以通过添加强制转换来消除编译错误 但无论如何都会在运行时中断 既然如此 如果 Java 不能在运行时执行 为什么允许向下转型呢 这个概念有什么实际用途吗 public class dem
  • ICSharpCode.SharpZipLib 验证 zip 文件

    使用 C 的 ICSharpCode SharpZipLib 如何验证传递的文件实际上是有效的 zip 文件 不是右键单击并重命名为 zip 的文件 HttpPost public ActionResult Upload HttpPoste
  • Safari JavaScript setTimeout 在最小化时停止

    这与以下几点有关 El Capitan 版 Safari 9 1Safari 10 塞拉利昂版 有谁知道当浏览器或选项卡失去焦点 主要是最小化 时 Safari 在 JavaScript 引擎中对 setTimeout 做了什么 我创建了一
  • 将 Application Insight 添加到现有的 Azure Service Fabric 群集

    自过去 4 个月以来 我们一直在开发 Azure Service Fabric 但现在决定拥有一个统一的日志基础设施 我们正在使用 AppInsight 我们如何将 AppInsight 密钥添加到现有的 Service Fabric 集群
  • 启用:仅关注键盘使用(或按 Tab 键)

    我想禁用 focus当不需要它时 因为我不喜欢焦点位于导航上时的外观 它使用相同的风格 active这很令人困惑 但是我不想为使用键盘的人摆脱它 我正在考虑添加一个类enabled focus在主体上按下标签 然后有body enabled
  • qsort 函数比较让我困惑

    我看到很多人在 qsort 比较器函数中使用减法 我认为这是错误的 因为在处理这些数字时 int nums 2147483648 1 2 3 INT MIN 2147483648 int compare const void a const