【问题标题】:is there a guarantee of how logic will be grouped in Java?是否可以保证如何在 Java 中对逻辑进行分组?
【发布时间】:2014-05-04 23:36:51
【问题描述】:
boolean A = true;
boolean B = false;
boolean C = true;


if(A == true && B == true || C == true);

我有什么理由可以理所当然地认为这将评估为假? (还是真的?)

我知道这里最好的办法是将两个重要的参数包装在它们自己的括号中,但我对 Java VM 以及它是否一致(尤其是在 Delvik 的情况下)感到好奇。它是否看到 B 为假并退出(因为 && 似乎要求它为真,如果从左到右阅读它)还是它本身将两个项目组合在 || 的两侧并继续查看 C 是否为真(在这种情况下,整个陈述最终为真)。

【问题讨论】:

    标签: java android logic operator-precedence


    【解决方案1】:

    这与 VM 无关,VM 在较低级别上工作,甚至看不到表达式的顺序与您在 Java 中编写它们的顺序相同。这里重要的是运算符优先级:

    http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

    就像他们在学校教你“先乘后加”一样,所有其他运算符也有优先权。在 Java 中,&& 的优先级高于 ||。因此

    (A == true && B == true || C == true)
    

    等价于

    ((A == true && B == true) || C == true)
    

    但实际上,就像你说的那样,使用那些括号。它使阅读更容易。

    免费提示:== true 是多余的。它什么也没做。将A == true 替换为A

    【讨论】:

    • +1 为 protip。对于A == false,它将是!A
    【解决方案2】:

    顺序在 Java 语言级别上定义良好(因此它适用于 JVM 和 Dalvik)。

    基本上

    • 从左到右
    • 快捷操作符缩短
    • && 和 || 之间存在运算符优先级

    后一点我个人永远记不住,或者至少不能可靠地快速解析,所以我总是使用括号来明确。使其更易于阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2019-04-20
      相关资源
      最近更新 更多