【问题标题】:Should 'if' test for '==' or '!=''if' 是否应该测试 '==' 或 '!='
【发布时间】:2012-07-25 23:53:12
【问题描述】:

!= 的使用次数超过== 有什么特别的原因吗?

我注意到!= 似乎更常见,但想知道这是否有原因。

【问题讨论】:

  • 你知道他们做不同的事情,对吧?
  • 我很好奇这是不是真的。我在 GCC 资源中找到了它,这就是我得到的:grep -B 2 "==" *.c | grep "if" | wc -l: 22.3k 点击。与!= 相同的查询仅给出:9.6k 次点击。看起来 GCC 开发者更喜欢==
  • @ArjunShankar:我对 Linux 源代码做了同样的事情:== 出现了 137k,而!= 只有 83k。数据似乎不支持问题中的断言。
  • @GregHewgill - 是的。无论哪种方式的偏见都是一件有趣的事情。另一个有趣的统计数据是:“if==采取 的频率,以及 != 发生同样情况的频率。
  • 每条语句的目的是完全不同的,一个是测试相等性,一个是测试是否与除相等性语句之外的所有内容相等。

标签: c if-statement


【解决方案1】:

如果你有这样的代码:

if (a == b)
{
    // block 1
}
else
{
    // block 2
}

可以改写为:

if (a != b)
{
    // block 2
}
else
{
    // block 1
}

这两个例子做同样的事情。两者都不比另一个更有效。如果一个比另一个使用得更多,那可能是个人喜好。

【讨论】:

  • 第二个版本确实有一点优势,就是更不容易误用一个=。
  • @EdHeal 是的,但大多数(全部?)主要编译器在这样做时会发出警告
  • @chochim:为什么会这样?
  • @stijn - 麻烦的是很多程序员确实忽略了警告。我个人没有,但一直参与发出大量警告的项目。
【解决方案2】:

您应该根据您要表达的逻辑条件使用==!=。如果您同时关心truefalse 条件,即ifelse 部分,那么切换的净效果(如果是简单的比较)就是哪个代码需要出现在哪个部分。

有一种编码风格,请参阅(书)Code Complete关于积极形成布尔表达式的部分,这表明表达积极事物的布尔表达式更容易比那些表达消极的人更理解。

如果您只关心计算结果为 true 时的条件,例如你只关心你是否相等(对于==)或不相等(对于!=),那么如果你选择正确的部分,你就不需要else部分。

【讨论】:

    【解决方案3】:

    大多数情况下,使用 != 或 == 的偏好取决于内容:

    resultOfOperationOrCall = operationOrCall(...);
    if (resultOfOperationOrCall != somePredefinedErrorTypeValue) {
    // Normal processing
    } else {
    // Exception/error processing
    }
    

    这里使用 != 在逻辑上比使用 == 更清晰

    【讨论】:

    • if (resultOfOperationOrCall == resultOK) 有什么问题?
    • 我看不出!= 在逻辑上比在这里使用== 更清晰。编写的代码不必要地脆弱。它假设没有特定错误与成功相同,这通常是一个错误的假设。如果该函数返回其他错误怎么办?即使今天没有,如果将来更改为返回其他错误怎么办?另外,我个人更喜欢先有失败路径;它们通常很短,并且当故障路径位于距离 if 条件几十行的某个 else 子句中时,更难遵循代码。
    • 如果您有一些PredefinedErrorTypeValue 但没有正常的结果值。在我的评论中 somePredefinedErrorTypeValue 可能为 null,任何不为 null 的都是正常的,只有 null 是错误(例如)
    【解决方案4】:

    我更喜欢!=,因为它更明确(并且将= 写成错误的机会更少)。

    【讨论】:

    • != 或 == 比较在 CPU 寄存器上一次完成所有位
    • 为什么== 需要测试所有位?它只需要测试到第一个不匹配。如果除了最后一位之外的所有内容都相同怎么办? != 在这种情况下仍然需要测试所有位。 ==!= 在这里没有区别。
    • 如果怕错别字,如何避免误写<=
    【解决方案5】:

    由于 == 和 != 都存在汇编代码,因此对于 x86 架构,没有高效或低效代码的问题。因此,这取决于您。您可以使用其中任何一种。

    如果对于某些机器,如果汇编代码不可用,那么高效或低效就可以通过编译器通过执行一些额外的操作(即添加额外的汇编代码)来实现。

    【讨论】:

      【解决方案6】:

      它完全且完全取决于用户的感知和需求。我看不出有任何理由说明为什么要使用 != 多于 ==

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        相关资源
        最近更新 更多