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