Java 版本 11 中布尔赋值和逻辑运算符的意外行为

问题描述 投票:0回答:1

我有两个代码片段

代码片段1

boolean flag = false;
System.out.println((flag = true) | (flag = false) || (flag = true));
System.out.println(flag);

代码片段2

boolean status = true;
System.out.println(status = false || status = true | status = false);
System.out.println(status);

我试图理解上述代码片段的输出。我读过Java中的运算符优先级,知道哪个先执行,哪个后执行。

规则是按位或>逻辑或>赋值

但是,我不明白为什么第一个代码片段有效而第二个代码片段引发错误 - 对我来说超级奇怪

E:\Practice-Tests\Test1\src\Test.java:215:43
java: unexpected type
  required: variable
  found:    value

为什么第一个标志变量

System.out.println((flag = true) | (flag = false) || (flag = true));
在 IntelliJ 上是灰色的

我想了解逻辑运算符和赋值在这种情况下如何工作。

java java-11
1个回答
0
投票

运算符优先级指示如何将像

status = false || status = true | status = false
这样的表达式分组为子表达式。

具体来说,片段

status = true | status = false
的分组类似于以下使用括号的表达式:

status = ((true | status) = false)

因为:

  1. 布尔或运算符的优先级高于赋值运算符
  2. 赋值运算符从右到左绑定

问题是

(true | status) = false
不是有效的赋值 -
(true | status)
不是可以存储值
false
的变量。

如果比较这两个表达式:

(flag = true) | (flag = false) || (flag = true)

status = false || status = true | status = false

您可以看到,在第一个示例中,括号指示如何在其他操作之前完成赋值,以及是否向第二个表达式添加类似的括号

(status = false) || (status = true) | (status = false)

你的第二个示例也将编译。

至于为什么第一次使用

flag
变量在IntelliJ IDEA中是灰色的:IntelliJ IDEA分析了代码,得出的结论是在

(flag = true) | (flag = false)

第一个作业没有用,您将代码简化为

true | (flag = false)
© www.soinside.com 2019 - 2024. All rights reserved.