为什么不能在没有赋值的情况下使用三元运算符(左边是变量)?

mig*_*WOZ 2 java ternary-operator

我已经搜索了这个问题,并且对于同样的问题存在一些问题,但这些问题的答案似乎都没有解决我的问题.

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

  • 第一个表达式到三元必须是boolean类型

  • 第二个和第三个表达式无法调用void方法.

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

String res;
System.out.println(res="walter");
Run Code Online (Sandbox Code Playgroud)

它将walter打印到控制台,这意味着表达式返回了一些东西,因此它不是空的.但现在如果试着写这个

String stuff = "TV";
String res=null;
stuff.equals ("TV") ? res= "Walter" :  res = "White" ;
Run Code Online (Sandbox Code Playgroud)

此代码无法编译 .赋值的左侧必须是变量

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

而且如果我这样做的话

res = stuff.equals("TV")?res="WALTER":res="WHITE";
Run Code Online (Sandbox Code Playgroud)

代码无法编译

对于参数类型java.lang.String,java.lang.String,运算符<=未定义

但是以下编译好了

res = stuff.equals("TV")?res="WALTER":"WHITE";
Run Code Online (Sandbox Code Playgroud)

PS

  • 为什么三元运算符的左侧必须有变量,方法返回值可以被丢弃,为什么不能在三元运算的情况下完成.
  • 为什么Java不允许它,如果允许它会导致什么问题或不一致

And*_*ner 7

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

int a = cond ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)

但你不能这样使用它:

cond ? 1 : 2;
Run Code Online (Sandbox Code Playgroud)

因为它不是StatementExpression; 这与你不能写任何一个事实相同:

1;
2 * 3;
array[1];
Run Code Online (Sandbox Code Playgroud)

因为他们只是没有任何目的.

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

int i = 0;
someMethod(i++);  // Use of i++ as an expression.
i++;              // Use of i++ as a StatementExpression.
Run Code Online (Sandbox Code Playgroud)

完整的StatementExpressions 列表可以在语言规范中找到:

StatementExpression:
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression
Run Code Online (Sandbox Code Playgroud)

因此,您不必具有赋值:您可以以人为的方式使用条件运算符,例如:

(true ? new int[1] : null)[0]++;
Run Code Online (Sandbox Code Playgroud)

(并不是说我以任何方式提倡这是好的代码,或者以任何方式有用;只是指出它是合法的)


至于其他问题:这些只是特定于编译器实现的消息.你的编译器绊倒了无效的语法,并尽力帮助你,但它并没有做得特别好.

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

第一个表单应使用if/else编写:

if (stuff.equals ("TV")) res= "Walter" else res = "White" ;
Run Code Online (Sandbox Code Playgroud)

(if顺便说一句)

第二个是缺少一些括号:

res = stuff.equals("TV")?(res="WALTER"):(res="WHITE");
Run Code Online (Sandbox Code Playgroud)

虽然第二和第三个操作数中的赋值仍然是多余的:

res = stuff.equals("TV")?"WALTER":"WHITE";    
Run Code Online (Sandbox Code Playgroud)