1 =假,0 =真?

Ben*_*Ben 25 c logic

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

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

caf*_*caf 36

比较函数通常返回0"等于",因此它们也可以返回"小于"的负数和"大于"的正数. strcmp()并且memcmp()像这样工作.

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


sar*_*old 14

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

$ false ; echo $?
1
$ true ; echo $?
0
Run Code Online (Sandbox Code Playgroud)

之所以选择这个是因为有一个程序成功的情况,但程序失败可能有很多原因 - 通过允许有许多不同的故障错误代码,程序可以确定为什么另一个程序失败而不必解析输出.

一个具体的例子是aa-statusAppArmor 强制访问控制工具提供的程序:

   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.
Run Code Online (Sandbox Code Playgroud)

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

  • `grep` 是一个很好的选择。“通常情况下,如果找到选定的行,退出状态为 0,否则为 1。但如果发生错误,退出状态为 2。” (2认同)
  • “程序成功的原因有很多种,但程序失败的原因可能有很多”——也称为[安娜·卡列尼娜原则](https://en.wikipedia.org/wiki/Anna_Karenina_principle) :) (2认同)

Abd*_*shi 8

简单的答案

0 = false 
1 = true
Run Code Online (Sandbox Code Playgroud)


Kel*_*end 6

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

  • 成功和失败(错误代码)是与布尔值非常不同的概念。此外,只有支持布尔类型的语言将有效表达式计算为 true 才符合逻辑,因此 0 等于 true(0 是有效的整数值)。 (2认同)

Pet*_* K. 5

我怀疑它只是遵循的Linux/Unix标准成功返回0.

真的说"1"是假的而"0"是真的吗?


Bre*_*ent 5

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

这就是说,它通常不建议工作,你使用任何语言或框架没有一个该死的好理由这样做的成语,所以无论谁写了这个功能可能是相当骨为首的,假设它不是简单的错误.

  • 0+1=1,FALSE 或 TRUE 为 TRUE;0*1=0,FALSE和TRUE都是FALSE;等等是这个符号的原因。 (4认同)