在Java中如何对逻辑进行分组有保证吗?

在Java中如何对逻辑进行分组有保证吗?,java,android,logic,operator-precedence,Java,Android,Logic,Operator Precedence,是否有任何理由我可以想当然地认为这将评估为错误?(还是真的?) 我知道这里最好的办法是将重要的两个参数包装在它们自己的参数中,但我很好奇Java VM,以及它是否一致(特别是在Delvik的情况下)。它是否看到B为假并退出(因为&&似乎要求它为真,如果从左到右读取它),或者它是否本机将两个项目分组在| |的两侧,并继续查看C是否为真(在这种情况下,整个语句都是真的)。这与VM无关,VM在较低的级别上工作,甚至看不到与用Java编写表达式顺序相同的表达式。这里重要的是运算符优先级: 就像他们在学

是否有任何理由我可以想当然地认为这将评估为错误?(还是真的?)


我知道这里最好的办法是将重要的两个参数包装在它们自己的参数中,但我很好奇Java VM,以及它是否一致(特别是在Delvik的情况下)。它是否看到B为假并退出(因为&&似乎要求它为真,如果从左到右读取它),或者它是否本机将两个项目分组在| |的两侧,并继续查看C是否为真(在这种情况下,整个语句都是真的)。

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

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

boolean A = true;
boolean B = false;
boolean C = true;


if(A == true && B == true || C == true);
相当于

(A == true && B == true || C == true)
但实际上,就像你说的,用括号。这使它更容易阅读


免费protip:
==true
是多余的。它没有任何作用。将
A==true
替换为just
A

顺序在Java语言级别上定义得很好(因此它可以在JVM和Dalvik上工作)

基本上

  • 从左到右
  • 快捷方式操作符缩短
  • &&和之间存在运算符关系||

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

+1用于protip。对于
A==false
,它将是
!A
((A == true && B == true) || C == true)