Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么带有赋值和等式检查的if语句的计算结果为false?_Java_If Statement_Logic - Fatal编程技术网

Java 为什么带有赋值和等式检查的if语句的计算结果为false?

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"); } } 为什么打印错误?表达式的解析方

当Java if语句同时具有赋值和相等性检查
-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他回答了乔恩和布林克莱特的两个问题。