Java 为什么带有赋值和等式检查的if语句的计算结果为false?
当Java if语句同时具有赋值和相等性检查Java 为什么带有赋值和等式检查的if语句的计算结果为false?,java,if-statement,logic,Java,If Statement,Logic,当Java if语句同时具有赋值和相等性检查或-d时,它是如何工作的 public static void test() { boolean test1 = true; if (test1 = false || test1 == false) { System.out.println("TRUE"); } else { System.out.println("FALSE"); } } 为什么打印错误?表达式的解析方
或-d时,它是如何工作的
public static void test() {
boolean test1 = true;
if (test1 = false || test1 == false) {
System.out.println("TRUE");
} else {
System.out.println("FALSE");
}
}
为什么打印错误?表达式的解析方式与您的想法不同。不是
(test1=false) || (test1 == false)
在这种情况下,结果应该是true
,但是
test1 = (false || test1 == false)
首先计算false | | test1==false
表达式的值,它是false
,因为test1
在计算中被设置为true
以这种方式解析它的原因是|
的优先级低于=
运算符的优先级,但高于赋值运算符的优先级=
这基本上是一个优先级问题。您假设您的代码等效于:
if ((test1 = false) || (test1 == false))
if (test1 = (false || test1 == false))
if (test1 = (false || false))
if (test1 = false)
。。。但事实并非如此。它实际上相当于:
if ((test1 = false) || (test1 == false))
if (test1 = (false || test1 == false))
if (test1 = (false || false))
if (test1 = false)
。。。这相当于:
if ((test1 = false) || (test1 == false))
if (test1 = (false || test1 == false))
if (test1 = (false || false))
if (test1 = false)
(因为test1
首先是true
)
。。。这相当于:
if ((test1 = false) || (test1 == false))
if (test1 = (false || test1 == false))
if (test1 = (false || false))
if (test1 = false)
它将值false
赋给test1
,表达式的结果为false
有关运算符优先级的有用表,请参见。(test1=false | | test1==false)
返回false,因为它们都是false。(test1=false | | test1==true)
这是true,因为其中一个为true
表达式test1=false | | test1==false
将在以下步骤中求值
步骤:1-test1=false | | test1==false
//的优先级最高
步骤:2-test1=false | | false
//运算符的优先级更高
步骤:3-test1=false
步骤:4-false
因为表达式的布尔值变为false。所以正在执行else语句。运行并检查。如果指定false和true,请查看打印的布尔值。然后阅读OR的工作原理。我想告诉大家,调试模式下的代码给出的是真值,运行模式下的代码给出的是假值。。。为什么会这样???。。。(我将断点设置为if条件).test1=false
,test1==false
是false
,false | false
是false或false
是false
。我知道你没有征求意见,但下面的答案确定了一个优先问题,以下是一些帮助我避免麻烦的做法(当我坚持这些做法时):(1)在没有100%确定优先级时,总是使用括号,或者为了更容易识别,以帮助其他开发人员。不要假设其他人会记住所有运算符(2)的优先规则,除非非常简单的if条件,否则通常应避免赋值以减少混淆。有一些常见的异常(特别是对于I/O、网络等的简单检查)。因为test1=true
+1@RohanFernando,还请注意,如果您在赋值前后加括号:((test1=false)| test1==false)
总值为true
。请写下解析发生的原因…是因为运算符的优先级顺序吗?@kondu这是一个公平的后续问题,我编辑后添加了一个到优先级表的链接,显示=
高于|
,但是=
在|
下面。最后一段是误导性的,因为要理解为什么选择第二次解析而不是第一次解析,只需知道(容易记住的)规则,即赋值的优先级低于任何非赋值运算符(此处|
)。|
和=
的相对优先级只与显示解析与test1=((false | test1)==false)
中的情况不同有关,我认为任何人都不会合理地预期到这一点(顺便说一句,相对优先级,或者更一般地说,|
,&
的优先级比关系低,也很容易记住,因为它一直都在使用)。@MarcvanLeeuwen|
和=
与|
的相对优先级解释了为什么这与(普通)a==b | | c==d
。完全错误。为什么在问题收到两个高质量的答案并描述了发生了什么之后,你会用如此不正确的信息回答?两个如此低质量的答案不值得单独写评论。你知道你的答案是胡说八道的,对吗?如果不是,请仔细阅读t他回答了乔恩和布林克莱特的两个问题。