use*_*290 27 java ternary-operator
下面的3行代码编译好了.(请注意,此代码是"人工Java编码"的示例,因此在专业编写的代码中不会出现.)
int x, y;
boolean b=true;
x = b ? y=1 : 2; // Compiles OK.
Run Code Online (Sandbox Code Playgroud)
如果我现在更改上面第3行中的代码,使其看起来像下面的代码行,编译器会生成错误.
// Change the position of the "y assignment", and now the code doesn't compile.
x = b ? 1 : y=2;
Run Code Online (Sandbox Code Playgroud)
这是语法错误消息:

有人可以解释这种行为(对新手Java学习者)吗?谢谢.
Mar*_*aux 36
简短:
这是因为运营商优先.第一种情况与此相同:
x = (b ? (y=1) : 2); // Compiles OK.
Run Code Online (Sandbox Code Playgroud)
而第二个是:
x = (b ? 1 : y) = 2;
Run Code Online (Sandbox Code Playgroud)
第一个编译确实很好,因为赋值被评估为新值.所以,如果b是真的,它将导致两者x并且y等于1.第二个就像是说:x = 1 = 2.所以,是的,要修复此编译器错误,请在您的语句中添加一些paratheses:
x = (b ? 1 : (y = 2)); // Outer () are not needed, but is clearer, IMHO.
Run Code Online (Sandbox Code Playgroud)
更长时间:
首先,Java中的运算符优先级表示赋值运算符的优先级低于条件三元运算符.这意味着您的第二个表达式相当于:
x = (b ? 1 : y) = 2;
Run Code Online (Sandbox Code Playgroud)
如你所见,这看起来很明显.的确,JLS§15.26说:
有12个赋值运算符; 所有这些都是语法上的右关联(他们从右到左分组).因此,
a=b=cmeansa=(b=c),赋值cto 的值,b然后赋值btoa.赋值运算符的第一个操作数的结果必须是变量,否则会发生编译时错误. (这解释了您面临的编译时错误)
在运行时,赋值表达式的结果是赋值发生后变量的值.赋值表达式的结果本身不是变量.
应用权利相关性:
x = ((b ? 1 : y) = 2);
Run Code Online (Sandbox Code Playgroud)
最后,我们可以看到为什么会产生编译器错误:三元条件运算符的结果不是变量(实际上我没有找到它在JLS中,但是编译器会在一个简单的测试用例中告诉你这样的变量:https://ideone.com/kMr7Xv).
| 归档时间: |
|
| 查看次数: |
1240 次 |
| 最近记录: |