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

时间:2013-03-08 10:29:52

标签: java post-increment

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 个答案:

答案 0 :(得分:146)

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值是文字(数字,字符串......)和方法。

答案 1 :(得分:29)

因为如JLS中所述:

  

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

答案 2 :(得分:14)

getInt()不是int

getInt()返回int

++运算符执行两项操作increment + assignment

因此,要使++运算符起作用,您需要一个变量来存储增量运算的结果,0getInt()都不是。

答案 3 :(得分:10)

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

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

// JK

答案 4 :(得分:5)

B和C都让编译器说:

  

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

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

答案 5 :(得分:4)

  

为什么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!

答案 6 :(得分:3)

  

0 ++

相当于0 = 0 + 1;,当然不可能。

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

  

getInt()++;

这里有类似的原因。

答案 7 :(得分:2)

因为0rValue(即您只能从赋值运算符的右侧使用它)not a lValue

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我的回答是#34;开箱即用"。

当我对操作员的使用有疑问时,我认为"它的重载功能等同于#34;这个运营商?

我知道,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 ++"或者像#34; getInt()++"这样的函数结果不是变量引用。

干杯。

答案 10 :(得分:0)

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