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

nou*_*oir 2 c standard-library memcmp language-lawyer

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

我一直在互联网上搜索,通常,memcmp定义说明如下:

memcmp()函数返回一个大于,等于或小于零的整数,因为s1指向的对象大于,等于或小于s2指向的对象.

这是从来没有明确说什么,究竟,则返回:这是两个字节的值之间的差异,或者是-1,0或1?我很迷惑:

  • memcmp在小程序中测试函数时,即使评估的两个字节之间的差值大于1或小于-1,它也会返回-1,0或1.
  • 在查看memcmpInternet上命名的函数时,它们几乎都返回2个字节之间的差异,作为int,而不是返回-1,0或1.

由于我无法得到足够精确的函数定义memcmp,我在这里问这个问题:究竟是什么函数memcmp应该返回?在某处有"官方"源代码吗?(我已经看过很多源代码,memcmp但没有给我一个答案:我假设它们不是写在库string.h中的函数,至少不在我的计算机上......)

ex *_*ilo 12

返回的特定值memcmp()未由标准指定.C11标准草案确实在§7.24.4中说:1:

比较函数memcmp,strcmp和strncmp返回的非零值的符号由第一对字符(均被解释为unsigned char)的值之间的差异符号确定,这些符号在被比较的对象中不同.

因此,只有比较函数的非零返回值的符号才应被视为有意义.这里给出的宽容度允许每个实现在其认为合适时解释这些要求.

另请注意,没有"官方源代码"; 标准是C实现必须遵守的文档.即使阅读用于查找用于生成memcmp()返回值的基础方法的实现的源代码,在代码中使用这些值最多也是不可移植的,并且容易受到该实现中未来更改的影响.


pm1*_*100 5

未指定具体结果的原因是

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

第二。通过不指定确切的结果,实现者可以编写非常高效的代码。memcmp 可以通过计算位或进行一些巧妙的与来实现。或者。异或等不会自然产生 1 或 -1。因此规范对确切的返回值保持沉默。