我有两个代码片段
代码片段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 上是灰色的
我想了解逻辑运算符和赋值在这种情况下如何工作。
运算符优先级指示如何将像
status = false || status = true | status = false
这样的表达式分组为子表达式。
具体来说,片段
status = true | status = false
的分组类似于以下使用括号的表达式:
status = ((true | status) = false)
因为:
问题是
(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)