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;
}
They are all int's, why won't B & C compile? Is it to do with the way ++
operator differs from = 0 + 1;
?
Invalid argument to operation ++/--
Solution 1:
i++
is an assignment to a variable i
.
In your case, zero++
is an equivalent to zero = zero + 1
. So 0++
would mean 0 = 0 + 1
, which makes no sense, as well as getInt() = getInt() + 1
.
More accurately :
int oneA = zero++;
means
int oneA = zero;
zero = zero + 1; // OK, oneA == 0, zero == 1
int oneB = 0++;
means
int oneB = 0;
0 = 0 + 1; // wrong, can't assign value to a value.
int oneC = getInt()++;
means
int oneC = getInt();
getInt() = getInt() + 1; // wrong, can't assign value to a method return value.
From a more general point of view, a variable is a L-value, meaning that it refers to a memory location, and can therefore be assigned. L in L-value stands for left side of the assignment operator (i.e. =
), even if L-values can be found either on the left side or the right side of the assignment operator (x = y
for instance).
The opposite is R-value (R stands for right side of the assignment operator). R-values can be used only on the right side of assignment statements, to assign something to a L-value. Typically, R-values are literals (numbers, characters strings...) and methods.
Solution 2:
Because as stated in JLS:
The result of the postfix expression must be a variable of a type that is convertible (§5.1.8) to a numeric type, or a compile-time error occurs.
Solution 3:
getInt()
is not int
getInt()
returns int
++
operator does two things increment
+ assignment
So for ++
operator to work you need a variable to store the result of increment operation which 0
and getInt()
both are not.