java新增返回int_java-为什么后增量运算符不能在返回int的方法上工作?

java-为什么后增量运算符不能在返回int的方法上工作?

public void increment(){

int zero = 0;

int oneA = zero++; // Compiles

int oneB = 0++; // Doesn't compile

int oneC = getInt()++; // Doesn't compile

}

private int getInt(){

return 0;

}

它们都是int的,为什么B&C不能编译? 与++运算符与= 0 + 1;运算符不同的方式有关吗?

无效的操作参数++ /-

11个解决方案

146 votes

=是对变量x = y的赋值。

在您的情况下,=与x = y等效。因此0++表示0 = 0 + 1,以及getInt() = getInt() + 1,这都没有意义。

更精确地 :

int oneA = zero++;

手段

int oneA = zero;

zero = zero + 1; // OK, oneA == 0, zero == 1

int oneB = 0++;

手段

int oneB = 0;

0 = 0 + 1; // wrong, can't assign value to a value.

int oneC = getInt()++;

手段

int oneC = getInt();

getInt() = getInt() + 1; // wrong, can't assign value to a method return value.

从更一般的角度来看,变量是L值,表示它是指内存位置,因此可以分配。 即使可以在赋值运算符的左侧或右侧找到L值(例如x = y),L值中的L也代表赋值运算符的左侧(即=)。

相反的是R值(R代表赋值运算符的右侧)。 R值只能在赋值语句的右侧使用,以将某物分配给L值。 通常,R值是文字(数字,字符串...)和方法。

xlecoustillier answered 2019-10-07T23:41:50Z

29 votes

因为如JLS中所述:

后缀表达式的结果必须是以下类型的变量:   可转换(第5.1.8节)为数字类型或编译时错误   发生。

PermGenError answered 2019-10-07T23:42:22Z

14 votes

++不是0

++返回0

++操作员执行两项操作0 + getInt()

因此,对于++运算符而言,您需要一个变量来存储增量运算的结果,而0和getInt()都不是。

Apurv answered 2019-10-07T23:43:09Z

10 votes

前置运算符和后置运算符仅在变量或左值被调用时进行操作。 左值是左值的缩写,即在赋值中可以站立在左边的东西。在您的示例中:

zero = 1; // OK

0 = 1; // Meaningless

getInt() = 1; // Also meaningless

//jk

j.karlsson answered 2019-10-07T23:43:41Z

5 votes

B和C都使编译器说:

意外类型,必需:变量,找到:值

因此,您不能递增值,只能变量。

answered 2019-10-07T23:44:21Z

4 votes

为什么后递增运算符不能在返回int的方法上使用?

因为它是一种getter方法,所以通过getter更改值没有意义。

int z = x + y++;

相当于:

int z = x + y;

y = y + 1;

因此,具有以下内容是无效的:

int z = x + getY()++;

等效于:

int z = x + getY();

getY() = getY() + 1; // invalid!

Eng.Fouad answered 2019-10-07T23:45:03Z

3 votes

0 ++

它等效于l-value,当然不可能。

即必须分配给l-value。

getInt()++;

类似的原因在这里。

Azodious answered 2019-10-07T23:45:56Z

2 votes

因为++是rValue(即,您只能从赋值运算符的右边使用它)not a lValue。

++运算符会递增该值并将其设置为自身,因此0++将给您一个错误。

Arsen Alexanyan answered 2019-10-07T23:46:30Z

0 votes

后增量和前增量只能在变量的帮助下应用。

Gijo answered 2019-10-07T23:46:57Z

0 votes

我的回答是“开箱即用”。

当我对运算符的用法有疑问时,我认为该运算符的“哪个与重载函数等效”?

我知道Java运算符没有运算符重载,这只是解决方案的另一种方法。

在这种情况下:

...

x++;

...

应理解为:

...

int /* function */ postincrement (/* ref */ int avalue)

{

int Result = avalue;

// reference value,

avalue = avalue + 1;

return Result;

}

...

postincrement(/* ref */ x);

...

和:

...

++x;

...

...

int /* function */ preincrement (/* ref */ int avalue)

{

// reference value,

avalue = avalue + 1;

int Result = avalue;

return Result;

}

...

preincrement(/* ref */ x);

...

因此,“ ++”的两个版本都可以作为通过引用接收变量参数的函数。

因此,像“ 0 ++”这样的文字值或像“ getInt()++”这样的函数结果都不是变量引用。

干杯。

umlcat answered 2019-10-07T23:48:03Z

0 votes

由于函数返回是RHS表达式,因此前/后递增/递减运算只能应用于LHS表达式。

Gaurav Phapale answered 2019-10-07T23:48:30Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值