8

如果有人能解释为什么会发生以下情况,我将不胜感激。非常感谢。

boolean b = true;
// Compiles OK.
// The LHS "assignment operand" requires no ()parentheses.
if (b=true || b==true);

// Reverse the ||'s operands, and now the code doesn't compile.
if (b==true || b=true);

// Add () around the RHS "assignment operand", and the code now compiles OK.
if (b==true || (b=true));

编辑 -

顺便说一句,代码行 #2 的编译错误是:“意外类型”,并且发生在短路 OR 运算符所在的位置:

if (b==true || b=true);
//          ^ "unexpected type" compilation error occurs here.

编辑 2 -

请注意,在这个问题中找到的代码片段是“高度人工 Java 编码”的示例,因此不会出现在专业编写的代码中。

编辑 3 -

我是这个非常有用的网站的新手,我刚刚学会了如何制作和上传 Java 编译消息的屏幕截图。下图复制了我在上面的第一个“编辑”中提供的信息。它显示了示例代码行 #2 的编译错误。

代码行 #2 编译错误

4

3 回答 3

6

赋值运算符=的优先级低于逻辑或运算符||,因此您可以在赋值中使用逻辑运算符而无需额外的括号对。也就是说,您希望能够编写

a = b || c;

而不是被迫写a = (b || c)

不幸的是,如果我们只使用运算符优先级,则此规则也适用于表达式的左侧。a || b = c必须解析为

(a || b) = c;

即使你的意图是a || (b = c)

于 2013-11-15T10:43:03.543 回答
5

Java 中赋值的优先级最低。因此,您的前两个表达式等效于:

if ( b = (true || b==true) );

if ( (b==true || b) = true );

第二个无法编译,因为表达式(b==true || b)不是 lValue (可以分配给的东西)。

如果添加括号,则在 OR 之前进行分配,一切正常。

于 2013-11-15T10:43:27.700 回答
2

使用运算符优先级(http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)我们有这个(我添加括号表示优先级):

  1. if (b=(true || (b==true))),b将被赋值给表达式并返回boolean,因此它适合条件;

  2. if (((b==true) || b)=true),左侧不适合赋值运算符(因为它是表达式而不是变量);

  3. if (((b==true) || (b=true))),boolean对应于boolean,ORbooleanboolean因为b是变量并=返回分配的值。

于 2013-11-15T10:51:28.190 回答