java 赋值的左边必须是变量_关于java:为什么不能在没有赋值的情况下使用三元运算符(左边是变量)?...

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

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

第一个表达式到三元必须是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";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值