繁体   English   中英

为什么post增量运算符不能处理返回int的方法?

[英]Why doesn't the post increment operator work on a method that returns an 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;区别= 0 + 1;

操作的参数无效++ / -

i++是对变量i的赋值。

在您的情况下, zero++相当于zero = zero + 1 所以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值中的L代表赋值运算符的左侧 (即= ),即使可以在赋值运算符的左侧或右侧找到L值(例如x = y )。

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

因为如JLS所述

后缀表达式的结果必须是可转换(§5.1.8)到数字类型的类型的变量,否则会发生编译时错误。

getInt()不是int

getInt()返回int

++运算符做两件事increment + assignment

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

前置和后置运算符仅在调用变量或左值时运行。 左值是左值的缩写,即在赋值中可以站在左边的东西。 在你的例子中:

    zero = 1; // OK
    0 = 1; // Meaningless
    getInt() = 1; // Also meaningless

// JK

B和C都让编译器说:

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

所以你不能增加一个值,只能增加一个变量。

为什么post增量运算符不能处理返回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!

0 ++

相当于0 = 0 + 1; 当然这是不可能的。

即它必须是l-value才能分配给它。

getInt()++;

类似的原因在这里

因为0是一个rValue (即你只能从赋值运算符的右边使用它) not a lValue

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

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

当我对运算符的使用有疑问时,我认为这个运算符的“它的重载函数等价于哪个”?

我知道,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()++”这样的函数结果不是变量引用。

干杯。

postincrement和preincrement只能在变量的帮助下应用。所以第一个案例编译。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM