为什么不能在没有分配的情况下使用三元运算符(左侧变量)?

时间:2018-11-23 16:31:30

标签: java ternary-operator

我已经搜索过这个问题,但是对于同一问题有一些疑问,但是这些问题的答案似乎都无法解决我的疑问。

我查看了规格并设法找到以下几点:

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

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

如果我编写以下代码,则会获得以上信息

String res;
System.out.println(res="walter");

它将walter打印到控制台,这意味着表达式返回了一些内容,因此它不是无效的。但是现在如果尝试写这个

String stuff = "TV";
String res=null;
stuff.equals ("TV") ? res= "Walter" :  res = "White" ;

此代码无法使用 作业的左侧必须是变量

即使同时满足以上两个条件(据我所知)。为什么代码无法编译以及为什么它需要左侧的变量?

此外,如果我这样做

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

代码无法使用

编译

对于参数类型java.lang.String,java.lang.String

未定义运算符<=

但随后可以正常编译

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

PS

  • 为什么在三元运算符的左侧必须有变量,所以可以放弃方法返回值,为什么在三元运算的情况下不能这样做。
  • 为什么Java不允许这样做,如果允许,它将导致什么问题或不一致之处

1 个答案:

答案 0 :(得分:6)

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

int a = cond ? 1 : 2;

但是您不能像这样使用它:

cond ? 1 : 2;

因为它不是StatementExpression;这与您不能写任何以下内容的事实基本相同:

1;
2 * 3;
array[1];

因为它们根本没有任何作用。

StatementExpression是一个表达式,您可以在其后弹出一个;,例如:

int i = 0;
someMethod(i++);  // Use of i++ as an expression.
i++;              // Use of i++ as a StatementExpression.

in the language spec可以找到StatementExpression的完整列表:

StatementExpression:
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression

这样,您不必进行赋值:您可以按如下人为方式使用条件运算符:

(true ? new int[1] : null)[0]++;

(不是我以任何方式主张这是好的代码,或以任何有用的方式;只是指出它是合法的)


对于其余的问题:这些只是特定于编译器实现的消息。您的编译器正在尝试使用无效语法,并尽最大努力为您提供帮助,但是它的工作并不是特别出色。

请注意,其他编译器(例如Ideone使用的编译器)会给出完全不同的消息。

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

if (stuff.equals ("TV")) res= "Walter" else res = "White" ;

(顺便说一下,{if是一个声明)

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

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

尽管第二和第三操作数中的分配仍然是多余的:

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