[英]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
因此,對於++
運算符來說,需要一個變量來存儲增量運算的結果,其中0
和getInt()
都不是。
前置和后置運算符僅在調用變量或左值時運行。 左值是左值的縮寫,即在賦值中可以站在左邊的東西。 在你的例子中:
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.