我有以下代码。这就是我理解的方式。
在第一种情况下,三元运算符返回y
的值,因为x=4
并且print语句按预期打印5
。
在第二种情况下,三元运算符首先将y的值赋给x,然后返回该值。再次,它按预期打印5。
在第三种情况下,三元运算符在x=y
左侧的x=z
和:
右侧public class Test {
public static void main(String[] args) {
int x = 4;
int y = 5;
int z = -1;
x = (x == 4) ? y : z; // compiles and runs fine
System.out.println(x + " " + y + " " + z);
x = (x == 4) ? x = y : z; // compiles and runs fine
System.out.println(x + " " + y + " " + z);
x = (x == 4) ? x = y : x = z; // Does not compile
System.out.println(x + " " + y + " " + z);
}
}
。我希望这与第二种情况非常相似。但是,这个语句甚至没有编译。
理解这一点的任何帮助将不胜感激。
{{1}}
答案 0 :(得分:5)
赋值的优先级低于三元表达式,因此表达式为:
(x==4)?x=y:x = z;
可以被认为是:
((x==4)?x=y:x) = z;
这显然不会编译,因为您无法为不属于变量的内容分配值。
答案 1 :(得分:2)
添加括号以控制评估顺序
x = (x == 4) ? (x = y) : (x = z); // Does compile.
注意以上相当于
if (x == 4) {
x = (x = y);
} else {
x = (x = z);
}
将x
分配值的(作为副作用)将分配给x
的值分配给x
。换句话说,你的三元相当于
x = (x == 4) ? y : z;
或强>
if (x == 4) {
x = y;
} else {
x = z;
}