【发布时间】:2017-12-12 00:11:09
【问题描述】:
我想知道函数memcmp 必须返回什么。
我一直在互联网上搜索,通常,memcmp 的定义如下所示:
memcmp() 函数返回一个大于、等于或小于零的整数,因此 s1 指向的对象大于、等于或小于 s2 指向的对象。
从来没有明确说明返回的是什么,究竟:是两个字节值之间的差异,还是 -1、0 或 1?我很困惑:
- 在小程序中测试函数
memcmp时,它返回 -1、0 或 1,即使评估的两个字节之间的差值大于 1 或小于 -1。 - 在 Internet 上查看名为
memcmp的函数时,它们几乎都以 int 形式返回 2 个字节之间的差异,而不是返回 -1、0 或 1。
由于我无法对函数memcmp 进行足够精确的定义,所以我在这里提出这个问题:函数memcmp 究竟应该返回什么?某处是否有“官方”源代码? (我看过很多memcmp 的源代码,但没有一个给我答案:然后我假设它们不是库 string.h 中编写的函数,至少不是在我的计算机上......)
【问题讨论】:
-
如果没有指定 - 它是实现定义的。保证行为在您的报价中。
-
您的报价说明了一切。除此之外的任何内容都是特定于实现的。
-
是的,它从来没有准确地说明过,因为除了您引用的一般保证之外,实际上没有确切的答案。不,没有“官方”的源代码可供阅读,因为没有官方的 C 标准库,只有流行程度不同的实现。而且因为这种行为是实现定义的,所以他们的源代码不会规定无论如何“必须”发生什么;他们所要做的就是标准所说的,仅此而已。您需要内化标准记录的不同类型的行为,以便进一步阅读任何 C 文档!
-
唯一保证行为是
< 0、> 0或== 0;针对-1或1等特定值进行测试只会以胃灼热告终。 -
@PeterJ:你如何编写(便携式 C)代码,性能优于
memcmp()?要比较相等性,您必须检查所有字节是否相同(尽管如果两个字节数组都足够对齐且足够大,则可以通过比较比字节更大的单位来加快速度)。如果您需要一个速度恒定的解决方案,它必须扫描所有两个内存块,而不是在第一个差异上停下来,否则它可以这样做。
标签: c language-lawyer standard-library memcmp