首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >准确地说,memcmp应该返回什么?

准确地说,memcmp应该返回什么?
EN

Stack Overflow用户
提问于 2017-07-07 15:55:31
回答 4查看 2.5K关注 0票数 2

我想知道memcmp必须返回什么函数。

我一直在互联网上搜索,通常情况下,memcmp定义如下所示:

函数返回大于、等于或小于零的整数,因为s1指向的对象大于、等于或小于s2指向的对象。

从来没有明确地说过,确切地返回了什么():是两个字节值之间的差异,还是-1、0或1?我很困惑:

  • 在小程序中测试函数memcmp时,它返回-1、0或1,即使计算出的两个字节之间的差值大于1或小于-1。
  • 当查看互联网上名为memcmp的函数时,它们几乎都返回两个字节之间的差额,作为int,而不是返回-1、0或1。

由于我无法得到函数memcmp的足够精确的定义,所以我在这里问这个问题:函数memcmp到底应该返回什么?某个地方有“官方”源代码吗?(我见过很多memcmp源代码,但没有人给我一个答案:我假设它们不是写在库字符串中的函数.h,至少不在我的计算机上.)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-07 16:02:25

标准没有指定memcmp()返回的特定值。C11草案标准在第7.24.4条1中确实说过

比较函数memcmp、strcmp和strncmp返回的非零值的符号由所比较对象中不同的第一对字符(都解释为无符号字符)的值之间的差异符号决定。

因此,只有来自比较函数的非零返回值的符号才是有意义的。这里给出的空间允许每个实现根据它认为合适的情况解释这些需求。

另外,请注意,没有“正式源代码”;标准是C实现必须遵守的文档。即使阅读用于查找用于生成memcmp()返回值的底层方法的实现的源代码,在代码中使用这些值充其量也是不可移植的,并且很容易受到该实现中未来更改的影响。

票数 12
EN

Stack Overflow用户

发布于 2017-07-07 16:14:36

未指定确切结果的原因是

首先,确切的结果并不重要。调用者只需要知道三个结果中的一个-- <=>。定义的行为起作用。现在规范可以说返回- 1,0,或者1。那么为什么不说这一点很重要呢?见第二点

第二。通过不指定确切的结果,实现者可以编写非常高效的代码。memcmp可以通过数位或做一些聪明的操作来实现。或。非自然产生1或-1的异或等。因此,规范对确切的返回值保持沉默。

票数 5
EN

Stack Overflow用户

发布于 2017-07-07 15:59:59

正如@EugeneSh所说,它没有定义。POSIX规范说,除了你引用的部分:

非零返回值的符号应由所比较对象中不同的第一对字节(都解释为类型无符号字符)的值之间的差异符号来确定。

因此,只有零/非零和正/负是适用于来自memcmp的返回值的有意义的测试。不要依赖于实际值,因为它们可能在不同的C库(甚至处理器体系结构)之间存在差异。

源例

我在GitHub上找到了GNU库(glibc)的镜像。memcmp接受两个字节之间的差异(第332行),因此返回值通常不只是-1或+1。然而,一个特定的库可能实现memcmp,但是对目标平台来说最有意义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44975110

复制
相关文章

相似问题

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