ChatGPT解决这个技术问题 Extra ChatGPT

为什么这个带有赋值和相等检查的 if 语句评估为假?

当 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?

运行并检查。如果您指定 false 并且指定 true,请查看打印的布尔值。然后阅读 OR 的工作原理。
我想告诉这个代码在调试模式下给出 TRUE 值,而在运行模式下给出 FALSE 值......为什么会这样???......(我把断点放在 if 条件上)......
test1=falsetest1==falsefalsefalse || falsefalse or false,即 false
我知道您不是在寻求建议,但是由于以下答案确定了优先级问题,因此这里有一些帮助我避免麻烦的做法(当我坚持这些做法时):(1)在不是 100% 时始终使用括号某些优先级或为了帮助其他开发人员更容易阅读。不要假设其他人会记住所有运算符的优先规则 (2) 除了非常简单的 if 条件外,通常应避免 if 赋值以减少混淆。有一些常见的例外情况(尤其是对 I/O、网络等的简单检查)。只是我的两分钱。
因为test1 = true

S
Sergey Kalinichenko

表达式没有按照您的想法进行解析。它不是

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

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

test1 = (false || test1 == false)

首先计算 false || test1 == false 表达式的值,它是 false,因为 test1 设置为 true 进入计算。

之所以这样解析,是因为||precedence低于==运算符,但高于赋值运算符=的优先级。


+1 @RohanFernando,还请注意,如果您要像这样在分配周围添加括号:((test1 = false) || test1 == false),总价值将是 true
请写下解析发生的原因...是因为运算符的优先级顺序吗?
@kondu 这是一个公平的后续问题,我编辑添加了一个指向优先表的链接,该表显示 == 高于 ||,但 = 低于 ||
最后一段是误导性的,因为要理解为什么选择第二个解析而不是第一个,只要知道(容易记住的)赋值对任何非赋值运算符(此处为 ||)的优先级较低的规则就足够了。 ||== 的相对优先级仅与显示解析 nottest1 = ((false || test1) == false) 中的情况相关,我认为任何人都不会合理地期望(顺便说一下,相对优先级) ,或者更一般地说,||&& 的优先级低于关系,也很容易记住,因为一直使用)。
@MarcvanLeeuwen ||==||= 的相对优先级解释了为什么这与 a == b || c == d 的(常见)情况不同。
J
Jon Skeet

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

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

……但事实并非如此。它实际上相当于:

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

...相当于:

if (test1 = (false || false))

(因为 test1true 开头)

...相当于:

if (test1 = false)

它将值 false 分配给 test1,表达式的结果是 false

有关运算符优先级的有用表,请参阅 Java tutorial on operators


佚名

https://i.stack.imgur.com/UcG6x.gif

表达式 test1 = false || test1 == false 将在以下步骤中进行评估。

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

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

步骤:3- test1 = false

步骤:4- false

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


D
Den

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


完全错误。为什么在问题收到两个描述所发生情况的高质量答案后的几天内,您会回答这样不正确的信息?
如此低质量的两个答案不值得单独写评论。你确实意识到你的回答是胡说八道,对吧?如果没有,请仔细阅读 Jon 和 blinkenlight 的两个答案。