簡體   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