为什么在java中不允许赋值和没有括号的布尔运算符

ser*_*erg 1 java variable-assignment boolean-expression assignment-operator assign

对不起,对于奇怪的问题表述.如果有人知道如何让它变得更好,我会很高兴.以为我们有3个布尔变量:

boolean a = false;
boolean b = false;
boolean c = false;
Run Code Online (Sandbox Code Playgroud)

Java允许编写以下内容:

System.out.println(a=b);
System.out.println(a==b & a==c);
Run Code Online (Sandbox Code Playgroud)

从这两个陈述中我预计以下内容也是合法的.

System.out.println(a=b & a=c);
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么在第二种情况下不允许,在第一种情况下允许它?在第二种情况下,两个赋值都以布尔值解析,而且对我来说看起来合法.

Sot*_*lis 9

将您的上一个代码段更改为

System.out.println((a = b) & (a = c));
Run Code Online (Sandbox Code Playgroud)

赋值运算符(=)具有较低的优先级比所述布尔逻辑AND运算符(&).使用括号显式分组表达式.


fge*_*fge 5

这是因为=优先级低于&(顺便提一下,它是片段中的布尔运算符而不是按位运算符; &&除了它不会短路外,它是相同的).

因此你的表达式读取(带有parens):

a = (b & a) = c
Run Code Online (Sandbox Code Playgroud)

但你不能分配cb & a.