为什么不赋值(左边的变量)就不能使用三元运算符?
Why can't Ternary operator be used without assignment (variable on the left)?
我已经搜索过这个并且有一些关于同一问题的问题,但是这些问题的 none 答案似乎解决了我的问题。
我查阅了规范并找到了以下几点:
第一个三元表达式必须是布尔类型
第二个和第三个表达式不能调用 void 方法。
如果我写出下面的代码就得到上面的信息
String res;
System.out.println(res="walter");
它打印 walter 到控制台,意思是表达式 returned something 因此它不是无效的。但现在如果尝试写这个
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
- 为什么三元运算符的左边必须有变量,方法return值可以被丢弃为什么在三元的情况下不能这样做。
- 为什么Java不允许,如果允许会造成什么问题或不一致
条件运算符是一个表达式:它有一个结果:
int a = cond ? 1 : 2;
但是你不能这样使用它:
cond ? 1 : 2;
因为它不是 StatementExpression
;这与您不能写以下任何内容的事实非常相似:
1;
2 * 3;
array[1];
因为它们没有任何作用。
一个StatementExpression
是一个表达式,你可以在后面弹出一个;
,例如:
int i = 0; // (Not actually a StatementExpression - it's a LocalVariableDeclaration - just showing what i is)
someMethod(i++); // Use of i++ as an expression.
i++; // Use of i++ as a StatementExpression.
可以找到 StatementExpression
的完整列表 in the language spec:
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";
我已经搜索过这个并且有一些关于同一问题的问题,但是这些问题的 none 答案似乎解决了我的问题。
我查阅了规范并找到了以下几点:
第一个三元表达式必须是布尔类型
第二个和第三个表达式不能调用 void 方法。
如果我写出下面的代码就得到上面的信息
String res;
System.out.println(res="walter");
它打印 walter 到控制台,意思是表达式 returned something 因此它不是无效的。但现在如果尝试写这个
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
- 为什么三元运算符的左边必须有变量,方法return值可以被丢弃为什么在三元的情况下不能这样做。
- 为什么Java不允许,如果允许会造成什么问题或不一致
条件运算符是一个表达式:它有一个结果:
int a = cond ? 1 : 2;
但是你不能这样使用它:
cond ? 1 : 2;
因为它不是 StatementExpression
;这与您不能写以下任何内容的事实非常相似:
1;
2 * 3;
array[1];
因为它们没有任何作用。
一个StatementExpression
是一个表达式,你可以在后面弹出一个;
,例如:
int i = 0; // (Not actually a StatementExpression - it's a LocalVariableDeclaration - just showing what i is)
someMethod(i++); // Use of i++ as an expression.
i++; // Use of i++ as a StatementExpression.
可以找到 StatementExpression
的完整列表 in the language spec:
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";