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

时间:2013-12-05 12:20:56

标签: java ternary-operator

下面的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;  

以下是语法错误消息:

Ternary operator syntax error

有人可以向新手Java学习者解释这种行为吗?谢谢。

4 个答案:

答案 0 :(得分:36)

<强>短

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

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

第二个是:

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

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

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

<强>长

首先,operator precedence in 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)。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

Java运算符优先级如下

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

这里ternary来自assignment操作。所以你的陈述将是这样的

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

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

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

答案 3 :(得分:2)

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

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

这样可以正常工作。