【问题标题】:1 = false and 0 = true?1 = 假 0 = 真?
【发布时间】:2011-09-22 10:37:11
【问题描述】:

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

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

【问题讨论】:

  • 我不太明白你的问题..
  • 有时 0 表示成功,其他数字指定错误代码。但我理解为什么这会令人困惑,因为函数返回 true/false。
  • 0=false, 1=true, and all other = true(适用于希望快速回答​​title中问题的任何人)。来源:§ 4.12
  • 仅在 C 标准库中查看类似 strcmp(字符串比较)的内容,以查看一般“1 = true”断言没有意义的示例。
  • > API 的编码器是否出错?没有。

标签: c logic


【解决方案1】:

比较函数在“等于”时返回0 是很常见的,因此它们也可以为“小于”返回负数,为“大于”返回正数。 strcmp()memcmp() 就是这样工作的。

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

【讨论】:

  • 有趣。如果是这种情况,那么将有两个不一致之处。 1) is_equals() 函数实际上应该称为 compare()。 2) 该函数需要返回一个负数。目前它只返回 0 和 1。也许以前的修订版做到了。那么问题是程序员愚蠢地搞砸“C流控制”的可能性要高出1和2。也许是前者,因为 API 中的其余函数通常返回 1 表示真,0 表示假。
  • 许多 int 类型的 C 函数在成功结果时确实返回 0,但这不应被视为 false 结果,而应视为 false 错误代码。这是有逻辑的。它比看起来更内部一致。不过,我不知道将其视为“错误是错误的”是否是他们想要的心理模型,或者我是如何解释它的......
  • 我遇到过很多变种,尤其是在 Pascal 代码中。诸如 -1 false 0 true 或 -1/1 之类的东西
【解决方案2】:

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

$ false ; echo $?
1
$ true ; echo $?
0

之所以选择此选项,是因为有一个程序成功的单一情况,但程序失败的原因可能有很多——通过允许存在许多不同的失败错误代码,程序可以确定原因 em> 另一个程序在没有解析输出的情况下失败了。

一个具体的例子是AppArmormandatory 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.

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

【讨论】:

  • grep 是一个不错的选择。 “通常,如果找到选定的行,则退出状态为 0,否则为 1。但如果发生错误,则退出状态为 2。”
  • 谢谢,有道理。我没有意识到错误状态是这样工作的。 is_equals 情况仍然很奇怪,因为它与任何类型的错误检查无关。
  • “程序成功的情况有一个,但程序失败的原因可能有很多”——也称为Anna Karenina principle :)
  • @unhammer,呵呵,太好了!谢谢
【解决方案3】:

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

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

【讨论】:

  • 似乎是这样,但是,这将是一个相当脑残的标准应用程序。 IsWhatever如果不是Is,则必须返回0,否则,if(!IsWhatever()){}怎么说?
  • 澄清一下 - 如果相等则返回 0,如果不相等则返回 1。因为它是一个 is_equals 函数,所以我把两者当作同义词。
【解决方案4】:

没有充分的理由让1 为真而0 为假;这就是事物一直以来的记号方式。所以从逻辑的角度来看,你的 API 中的函数本身并没有“错误”。

也就是说,通常不建议在没有充分理由的情况下反对您正在使用的任何语言或框架的习语,因此编写此函数的人可能非常愚蠢-头部,假设它不仅仅是一个错误。

【讨论】:

  • 0+1=1,FALSE 或 TRUE 为 TRUE; 0*1=0,FALSE 和 TRUE 为 FALSE;等是符号的原因。
【解决方案5】:

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

【讨论】:

  • 成功和失败(错误代码)是一个与布尔值非常不同的概念。此外,对于支持布尔类型的语言来说,将有效表达式评估为 true 是唯一合乎逻辑的,因此 0 等于 true(0 是有效的整数值)。
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

    简单回答

    0 = false 
    1 = true
    

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      相关资源
      最近更新 更多