三元运算符,使用赋值时出现语法错误

下面的3行代码编译好了。 (请注意,此代码是“人工Java编码”的示例,因此在专业编写的代码中不会出现。)

int x, y; boolean b=true; x = b ? y=1 : 2; // Compiles OK. 

如果我现在更改上面第3行中的代码,使其看起来像下面的代码行,编译器会生成错误。

 // Change the position of the "y assignment", and now the code doesn't compile. x = b ? 1 : y=2; 

这是语法错误消息:

三元运算符语法错误

有人可以解释这种行为(对一个新手Java学习者)吗? 谢谢。

简短

这是因为运营商优先。 第一种情况与此相同:

 x = (b ? (y=1) : 2); // Compiles OK. 

而第二个是:

 x = (b ? 1 : y) = 2; 

第一个编译确实很好,因为赋值被评估为新值。 因此,如果b为真,则会导致xy等于1.第二个就像是说: x = 1 = 2 。 所以,是的,要修复此编译器错误,请在您的语句中添加一些paratheses:

 x = (b ? 1 : (y = 2)); // Outer () are not needed, but is clearer, IMHO. 

更长的

首先, Java中的运算符优先级表示赋值运算符的优先级低于条件三元运算符。 这意味着你的第二个表达式相当于:

 x = (b ? 1 : y) = 2; 

如你所见,这看起来很明显。 的确, JLS§15.26说:

有12个赋值运算符; 所有这些都是语法上的右关联 (他们从右到左)。 因此, a=b=c表示a=(b=c) ,它将c的值赋给b ,然后将b的值赋给a

赋值运算符的第一个操作数的结果必须是变量 ,否则会发生编译时错误。 (这解释了您面临的编译时错误)

在运行时,赋值表达式的结果是赋值发生后变量的值。 赋值表达式的结果本身不是变量。

应用权利相关性:

 x = ((b ? 1 : y) = 2); 

最后,我们可以看到为什么会产生编译器错误:三元条件运算符的结果不是变量 (实际上我没有在JLS中找到它,但编译器会在一个简单的测试用例中告诉你这样的变量 : https : //ideone.com/kMr7Xv )。

请参阅“Java运算符优先级”。 同时,使用:

 x = (b ? 1 : (y=2)); 

Java运算符优先级如下

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

这里ternaryassignment操作之前到来。 所以你的陈述将是这样的

x =(三元评估)=分配值

如果你仍然想要y的设定值,当b为假时,你可以使用()代表’y = 2’进行内部三元评估。

 x = b ? 1 : (y=2); 

兄弟,试着把表达放在括号中。

X =(b≥1:(y = 2));

这样可以正常工作。