小于比.等效于效率C/C++

Joh*_*0te 14 c c++

当我使用旧的API,例如Unix上的C套接字API时,我总是注意到在比较它们的错误返回值时,人们比<等于()更喜欢小于()==.

int result = send(...);
if (result < 0) { perror("..."); }
Run Code Online (Sandbox Code Playgroud)

在我所指的情况下,返回代码只是积极的0,或者-1(errno设置为正确的值).那么为什么不用(result == -1)而不是用来检查错误(result < 0)

我问,因为我想知道这是出于习惯还是使用少于?的效率更高?我正在考虑这样一个事实:如果你比较两个uint64_ts并且你发现了MSB的差异,你就不必检查其他7个字节,等等.我可能会接触到这个逻辑!

Arm*_*yan 15

我认为这既不是为了习惯也不是为了效率.它更安全,因为您不依赖于特定的返回代码.相反,您依赖于错误代码是否定的.例如,strcmp当第一个字符串小于第二个字符串时,函数返回"负值".在大多数实现中,它将返回-1,但处理它的正确方法是检查< 0

  • 这也是我所假设的......它也允许返回任何负面代码.一些函数可以返回多个"错误"代码,所有这些代码都是否定的......例如,"选择". (4认同)

Ker*_* SB 9

好的,我们来看看.这是在x86上使用GCC 4.6.1 -O3,并且a是类型int:

if (a < 0):

 movl    4(%esp), %eax
 testl   %eax, %eax
 js      .L4
Run Code Online (Sandbox Code Playgroud)

if (a == -1):

cmpl    $-1, 4(%esp)
je      .L4
Run Code Online (Sandbox Code Playgroud)

4(%esp)是变量a,并.L4指定条件的跳转目标.


更新:由于@yi_H表明,现在让我们来比较if (h() < 0)if (h() == -1),其中int h();一些功能.我们有:

<       testl   %eax, %eax
<       js      .L4
---
>       cmpl    $-1, %eax
>       je      .L4
Run Code Online (Sandbox Code Playgroud)


Jad*_*son 5

这样做是为了鲁棒性,而不是效率。如果您只检查特定的返回值,例如 -1,并且稍后将 API 修改为针对一种类型的错误返回 -1,针对另一种类型的错误返回 -2,则代码将不再正确运行。在大多数 API 中,负返回值表示错误,因此检查返回值是否为负以确定是否发生错误是可靠的解决方案。