我已经搜索了这个问题,并且对于同样的问题存在一些问题,但这些问题的答案似乎都没有解决我的问题。
我已经查看了规范,并设法找到以下几点:
第一个表达式到三元必须是boolean类型
第二个和第三个表达式无法调用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不允许它,如果允许它会导致什么问题或不一致
因为它是一个表达式,而不是StatementExpression。
不知道你为什么要这样完成任务,你应该能够这样做:res = stuff.equals("TV") ?"Walter" : "White" ;这样做更清洁一点,让你不必多次放res =
@Quinn我正在准备考试,这是我考试中的一个问题的选择。
部分答案:第一个语法错误是由运算符优先级规则引起的。 stuff.equals ("TV") ? res="Walter" : res ="White"被解析为(stuff.equals ("TV") ? res="Walter" : res) ="White"。 尝试改为stuff.equals ("TV") ? res="Walter" : (res ="White"),但即便如此,它也不会因Andy给出的原因而编译。
条件运算符是一个表达式:它有一个结果:
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.
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";