Java 为什么可以';三元运算符是否可以不赋值使用(变量在左边)?

Java 为什么可以';三元运算符是否可以不赋值使用(变量在左边)?,java,ternary-operator,Java,Ternary Operator,我已经搜索了这个问题,有一些关于同一个问题的问题,但这些问题的答案似乎都没有解决我的问题 我查阅了规范,并设法找到了以下几点: 三元的第一个表达式必须是布尔类型 第二个和第三个表达式不能调用void方法 如果我写下面的代码,请给出上述信息 String res; System.out.println(res="walter"); 它将walter打印到console,这意味着表达式返回了一些东西,因此它不是无效的。但是现在如果你想写这个 String stuff = "TV"; Strin

我已经搜索了这个问题,有一些关于同一个问题的问题,但这些问题的答案似乎都没有解决我的问题

我查阅了规范,并设法找到了以下几点:

  • 三元的第一个表达式必须是布尔类型

  • 第二个和第三个表达式不能调用void方法

如果我写下面的代码,请给出上述信息

String res;
System.out.println(res="walter");
它将walter打印到console,这意味着表达式返回了一些东西,因此它不是无效的。但是现在如果你想写这个

String stuff = "TV";
String res=null;
stuff.equals ("TV") ? res= "Walter" :  res = "White" ;
此代码无法使用编译 赋值的左侧必须是变量

即使上述两个条件都满足(据我所知)。为什么代码不编译,为什么它需要左边的变量

而且如果我这样做

res = stuff.equals("TV")?res="WALTER":res="WHITE";
该代码无法使用


运算符条件运算符是一个表达式:它有一个结果:

int a = cond ? 1 : 2;
但你不能这样使用它:

cond ? 1 : 2;
因为它不是一个
语句表达式
;这与您无法编写以下任何内容的事实基本相同:

1;
2 * 3;
array[1];
因为它们没有任何作用

语句expression
是一个可以弹出
的表达式之后,例如:

int i = 0;
someMethod(i++);  // Use of i++ as an expression.
i++;              // Use of i++ as a StatementExpression.
可以找到
语句expression
的完整列表:

因此,您不必进行赋值:您可以通过以下方式人为地使用条件运算符:

(true ? new int[1] : null)[0]++;
(并不是说我在任何方面都主张这是一部好的法典,或在任何方面都是有用的;只是指出它是合法的)


至于其他问题:这些只是编译器实现特定的消息。您的编译器正在被无效语法绊倒,并尽最大努力帮助您,但它做得并不特别好

请注意,其他编译器(例如,Ideone使用的编译器)提供完全不同的消息

第一种形式应使用if/else:

if (stuff.equals ("TV")) res= "Walter" else res = "White" ;
如果
是一个语句,顺便说一句)

第二个只是缺少一些括号:

res = stuff.equals("TV")?(res="WALTER"):(res="WHITE");
尽管第二个和第三个操作数中的赋值是冗余的:

res = stuff.equals("TV")?"WALTER":"WHITE";    

因为它是一个表达式,而不是一个语句表达式。不确定为什么要这样做赋值,您应该可以这样做:
res=stuff.equals(“TV”)?“沃尔特”:“怀特”
这是一种更干净的方法,可以让您不必放置多个
res=
times@Quinn我正在准备考试,这是我考试中的一个问题。部分答案:第一个语法错误是由于运算符优先规则引起的<代码>stuff.equals(“电视”)?res=“Walter”:res=“White”
被解析为
(stuff.equals(“TV”)?res=“Walter”:res)=“White”
。试试看
stuff.equals(“电视”)?res=“Walter”:(res=“White”)
但即便如此,由于Andy给出的原因,它也无法编译。
res = stuff.equals("TV")?(res="WALTER"):(res="WHITE");
res = stuff.equals("TV")?"WALTER":"WHITE";