【问题标题】:Why does the "or" go before the "and"?为什么“或”在“和”之前?
【发布时间】:2014-05-13 00:15:11
【问题描述】:
int it=9, at=9;

if(it>4 || ++at>10 && it>0)  
{
    System.out.print("stuff");    
}

System.out.print(at);

打印出 stuff9,我想知道为什么我认为 ++at>10 && it>0 会首先被评估,从而使 at = 10。

【问题讨论】:

  • 除了变量名,这是个好问题。我不明白为什么它被否决了。
  • @mikeyaworski - 对于 OP 的要求,“先行”并不是完全正确的术语。而这一切都包含在任何半体面的 Java 教科书或教程中。
  • @StephenC 很多问题都可以在一本书或教程中得到解答。他使用了 and 之前 or 的知识,但没有意识到短路会导致意外输出。我认为这是一个公平的调查,无论短路是否在书中。有了这些知识,人们可能仍然会想他的想法。
  • @mikeyaworski - 现在>>你更高的优先级。但无论如何,我只是在解释为什么有些人会认为这是一个糟糕的问题。
  • @StephenC 感谢您的更正,虽然我不明白为什么“precede”不正确。不过,这不是拒绝投票的好理由,但我知道你只是在指出这一点。

标签: java operator-precedence


【解决方案1】:

运算符优先级仅控制参数分组;它对执行顺序没有影响。在几乎所有情况下,Java 的规则都说语句是从左到右执行的。 ||&& 的优先级导致 if 控制表达式被计算为

it>4 || (++at>10 && it>0)

&& 的更高优先级并不意味着&& 首先得到评估。相反,

it>4

被评估,因为它是真的,|| 的短路行为意味着右侧根本不被评估。

【讨论】:

    【解决方案2】:

    你的复合表达式等价于

    if(it>4 || (++at>10 && it>0))  
    

    由于 Java 运算符优先规则。 || 的操作数是从左到右计算的,所以首先计算 it>4,也就是 true,所以它的其余部分(整个 && 子表达式)根本不需要计算(并且所以at 不会改变)。

    【讨论】:

      【解决方案3】:

      我觉得我应该添加如何实际获得您的预期输出。

      简要说明:|| 运算符 short-circuits 是整个表达式,因此右侧甚至不被计算。

      但是,为了短路并获得预期的输出,而不是 || 运算符,只需使用 |,如下所示:

      int a = 9, b = 9;
      
      if(a>4 | ++b>10 && a>0)  
      {
          System.out.print("stuff");    
      }
      System.out.print(b);
      

      输出是stuff10

      这样,无论一方是真是假,它们都仍然被评估。

      &&& 也是如此

      【讨论】:

        猜你喜欢
        • 2021-09-03
        • 1970-01-01
        • 2011-02-20
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 2011-02-12
        • 1970-01-01
        相关资源
        最近更新 更多