【问题标题】:Should I use != or == first when implementing an if else for comparison在实现 if else 进行比较时,我应该首先使用 != 还是 ==
【发布时间】:2017-05-26 20:56:56
【问题描述】:

这一直困扰着我一段时间,我不确定是否有正确的答案:

取这两条语句

if(foo == bar)
    do this;
else if(foo != bar)
    do that;

if(foo != bar)
    do that;
else if(foo == bar)
    do this;

其中哪一项是正确的(暂时忘记优化) 我的想法告诉我,答案取决于预期的结果,例如,如果它在循环中运行,并且我预测 foo 将等于 bar 的次数多于它不是的次数,那么第一个是正确的。

符号之间是否有任何效率影响?

【问题讨论】:

  • 让 JITC 担心优化级别。担心是什么让你的代码最易读。
  • 同意。更具可读性的代码。这基本上等于用于比较的特定数据。如果您主要拥有姓名数据库,并且大多数是约翰的.. 并且您对非约翰更好奇,您会使用 != "John" .. 反之亦然。
  • 这是一般规则,不只是在这个粒度级别。首先是人类可理解性的代码;电脑比你想象的要快。
  • 为什么不用else 而不是else if
  • @LouisWasserman 因为可能涉及更多变量,认为您错过了问题的重点

标签: java android if-statement operators


【解决方案1】:

但是符号之间是否存在任何效率影响? 没有。根本没有。更喜欢可读性最强的那个。如果在句子中说“如果不是a”更好,请使用!。否则,不要。

【讨论】:

  • 条件可能有副作用。在这种情况下,可能不是从效率的角度来看,而是为了防止错误的结果。所以if ((nr = in.read(...)) < 0) { ignore(); } else if (nr == 0) { ... } else { ... } 如果你改变条件的顺序就不会工作。
【解决方案2】:

如果你不想去 If...else 条件,你可以使用三元运算符。

喜欢 结果 = 测试语句?值1:值2;

但是对于嵌套条件,三元运算符看起来很复杂。

【讨论】:

    【解决方案3】:

    在优化方面确实有很大的不同。这取决于您的风格和偏好。您的两个示例具有相同的影响。

    【讨论】:

      【解决方案4】:

      为什么不这样做

      if(foo == bar)
      do this;
      else 
      do that;
      

      这样看起来更清晰,如果您在条件块内返回任何语句,它会使程序更具可读性

      【讨论】:

      • 而且它也使用较少的操作。而更快的:==!= 更快,因为它只是一个比较,而不是比较 + 否定。
      • @Rotwang 你能写一个答案吗,因为这很有趣
      • @Rob85 好吧,这可能是也可能不是问题,因为 ProGuard 可以优化您的代码,但我总是更喜欢编写已经优化的代码,就好像编译器很愚蠢一样。从我的 VB 和 VB.NET 时代开始,我就这样做了。在移动设备等有限的机器上,我仍然觉得我必须挤压字节。
      • @LewBloch 我不需要花括号
      • 恐怕你确实需要在你的条件和循环语句周围加上花括号,@Kenny Togunloju。生活中的代码经常被修改。修改代码时缺少花括号会导致错误。所有 Java 编码标准都需要大括号,包括 Oracle 自己的 oracle.com/technetwork/java/javase/documentation/… 和 Google 的 google.github.io/styleguide/javaguide.html#s4.1-braces
      【解决方案5】:

      如果我理解正确,您是在询问以下两个 sn-ps 之间的区别。

      if (predicate1()) {
          doThis();
      } else if (predicate2()) {
          doThat();
      }
      
      if (predicate2()) {
          doThat();
      } else if (predicate1()) {
          doThis();
      }
      

      如果 predicate1 和 predicate2 可能同时为真,那么结果就会有所不同,我相信您已经意识到这一点。所以我会假设其中最多有一个是真的。我还假设我们可以放心地忽略评估条件的任何副作用。

      是否存在可读性差异?不像代码那样。然而,在具体情况下,普通读者很可能会发现首先评估一个谓词更自然。如果是这样,就这样吧。

      你问的是效率。第一个答案是,你不应该。但无论如何,有两条准则,我想你已经触及了两条:

      • 首先评估最常见的条件
      • 首先评估最便宜的条件

      如果我们有数字,我们可以做一个很好的数学计算每个 sn-p 的平均成本并选择最好的。

      至于==还是!=哪个更便宜,以我的态度我显然不知道答案。我希望它会随着您比较的类型、您是运行字节码还是本机代码、您的 CPU 类型和其他因素而有所不同。你可以去测量,周围可能会有人知道一两个规则。无论如何,差异必须非常微小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-19
        • 2012-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多