1 =假,0 =真?

时间:2011-06-25 01:22:48

标签: c logic

我在c API中遇到了一个is_equals()函数,它返回1表示非相等的sql表(false),0表示相等的sql表(true)。我只是在我的代码上运行测试用例后才意识到这一点,一个用于正面示例,另一个用于负面,它们都失败了,起初没什么意义。 API中的代码没有错误,因为输出已在其文档中正确记录。

我的问题 - 是否存在颠倒的世界/平行宇宙/编码语言,这种逻辑符号是否正常?通常不是1吗? API的编码器是否出错?

6 个答案:

答案 0 :(得分:34)

比较函数通常会在“等于”上返回0,因此它们也可以返回“小于”的负数和“大于”的正数。 strcmp()memcmp()就像这样工作。

然而,零是假的,非零是真的,因为这是C流控制和逻辑布尔运算符的工作方式。所以可能是为这个函数选择的返回值很好,但是函数的 name 是错误的(它应该只是被称为compare()或类似的)。

答案 1 :(得分:14)

这种颠倒世界在过程错误返回时很常见。 shell变量$?报告从shell执行的前一个程序的返回值,因此很容易判断程序是成功还是失败:

$ false ; echo $?
1
$ true ; echo $?
0
选择这个是因为有一个程序成功的情况,但程序失败可能有很多原因 - 允许有许多不同的失败错误代码,程序可以确定为什么另一个程序失败而不必解析输出。

具体示例是AppArmor mandatory access control工具随附的aa-status程序:

   Upon exiting, aa-status will set its return value to the
   following values:

   0   if apparmor is enabled and policy is loaded.

   1   if apparmor is not enabled/loaded.

   2   if apparmor is enabled but no policy is loaded.

   3   if the apparmor control files aren't available under
       /sys/kernel/security/.

   4   if the user running the script doesn't have enough
       privileges to read the apparmor control files.

(我确信有更广泛传播的程序有这种行为,但我很清楚这一点。:)

答案 2 :(得分:5)

我怀疑它只是关注Linux / Unix standardreturning 0 on success

真的说“1”是假的而“0”是真的吗?

答案 3 :(得分:5)

没有充分理由1为真,0为假;这就是事情总是被注意到的方式。因此从逻辑角度来看,API中的函数本身并不“错误”。

那就是说,通常不建议反对你正在使用的任何语言或框架的习语而没有这么做的理由,所以无论谁写这个函数都可能是相当的骨头 - 假设它不仅仅是一个错误。

答案 4 :(得分:3)

这可能是原作者的一个错误,但是1是真,0是假的概念不是一个普遍的概念。在shell脚本中,为了成功返回0,为失败返回任何其他数字。在其他语言(如Ruby)中,只有nil和false被认为是false,而任何其他值都被认为是真的,所以在Ruby中,1和0都被认为是真的。

答案 5 :(得分:2)

我不确定我是否正确回答了这个问题,但这是一个熟悉的例子:

如果出现错误,Windows中GetLastError()的返回类型为非零,否则为零。反之通常是您调用的函数的返回值。