为什么带有分配和相等性检查的if语句评估为false?


105

Java if语句同时具有赋值和相等检查OR-d 时如何工作?

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

为什么此打印为FALSE?


1
运行并检查。如果分配为false和分配为true,则查看输出的布尔值。然后阅读OR的工作原理。
Pratik 2015年

2
我想告诉您,这段代码在调试模式下给出的是TRUE值,而在运行模式下给出的是FALSE值...为什么这样??? ...(我将断点放在if条件下)...
CoderNeji

test1=falsetest1==falseis falsefalse || falseis false or falseis是false
Jared Burrows 2015年

我知道您不是在征求意见,但由于以下答案确定了优先事项,因此有以下几种做法可以帮助我避免麻烦(当我坚持这些原则时):(1)始终使用括号而不是100%某些优先级,或者为了帮助其他开发者更容易阅读。不要以为其他人会记住所有运算符的优先规则(2)除了非常简单的if条件之外,通常应避免if赋值以减少混乱。有一些常见的例外(特别是对I / O,网络等进行简单检查)。只是我的两分钱。
rimsky 2015年

因为test1 = true
jono

Answers:


189

表达式未按照您的思维方式进行解析。不是

(test1=false) || (test1 == false)

在这种情况下,结果应该是true

test1 = (false || test1 == false)

false || test1 == false首先计算expression 的值,它的值为false,因为test1设置为true要进行计算。

它被解析这种方式的原因是,优先级||比的降低==操作者,但比赋值运算符的优先级更高=


2
+1 @RohanFernando,还请注意,如果您要像这样在作业周围加上方括号,则((test1 = false) || test1 == false)总值为true
Arnon Zilca 2015年

1
请写出发生解析的原因,是因为运算符的优先顺序?
kondu 2015年

3
@kondu这是一个公平的后续问题,我编辑了一个链接,以添加到优先级表的链接,该链接表显示==在之上||,但=在之下||
dasblinkenlight

从理解为什么选择第二个分析而不是第一个分析的意义上来说,最后一段是令人误解的,只要知道(容易记住的)规则,即赋值优先于任何非赋值运算符(在此||),就足够了。的相对优先级||==只有相关证明解析是作为test1 = ((false || test1) == false),我不认为任何人会合理预期(顺便说相对优先级,或更普遍的是 ||&&比关系的优先级低,也容易请记住,因为一直使用)。
Marc van Leeuwen

1
@MarcvanLeeuwen的相对优先级||==VS ||=解释了为什么这种行为不同从的(普通)的情况下a == b || c == d
亚伦·迪富

83

基本上,这是一个优先问题。您假设您的代码等效于:

if ((test1 = false) || (test1 == false))

...但是不是。它实际上等效于:

if (test1 = (false || test1 == false))

...相当于:

if (test1 = (false || false))

(因为test1true从开始)

...相当于:

if (test1 = false)

将值赋值falsetest1表达式,结果为false

有关运算符优先级的有用表,请参见有关运算符Java教程


2

请看一下运算符的优先级

表达式test1 = false || test1 == false将在以下步骤中求值。

STEP:1- test1 = false || test1 == false //优先级==最高

步骤:2- test1 = false || false //运算符||具有更高的优先级

步骤:3- test1 = false

第4步- false

由于表达式的布尔值变为false,因此执行了else语句。


-11

(test1 = false || test1 == false)返回false,因为它们都为false。(test1 = false || test1 == true)这是真的,因为其中之一是真的


1
完全错误。为什么在问题收到两个高质量的描述问题发生的答案后的第二天,您会用如此不正确的信息回答?
l4mpi

5
如此低质量的两个答案不值得单独发表评论。您确实知道答案是胡说八道,对吗?如果没有,请仔细阅读乔恩(Jon)和眨眼间的两个答案。
l4mpi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.