Почему оператор post increment не работает над методом, который возвращает 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;
?
Недопустимый аргумент для операции ++/-
Ответы
Ответ 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 - это литералы (числа, строки символов...) и методы.
Ответ 2
Потому что, как указано в JLS:
Результат выражения postfix должен быть переменной типа, который (§5.1.8) к числовому типу или ошибка времени компиляции имеет место.
Ответ 3
getInt()
не int
getInt()
возвращает int
Оператор ++
выполняет две вещи: increment
+ assignment
Итак, для работы оператора ++
вам нужна переменная, чтобы сохранить результат операции инкремента, который 0
и getInt()
не являются.
Ответ 4
Пред- и пост-операторы работают только с переменными или lvalues по мере их вызова. lvalue является коротким для левого значения, то есть что-то, что может стоять слева в задании.
В вашем примере:
zero = 1; // OK
0 = 1; // Meaningless
getInt() = 1; // Also meaningless
//Ю.К.
Ответ 5
Оба B и C заставляют компилятор сказать:
неожиданный тип, обязательно: переменная, найден: значение
Таким образом, вы не можете увеличивать значение, а только переменную.
Ответ 6
Почему оператор post increment не работает с методом, который возвращает 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!
Ответ 7
0 ++
Это эквивалентно 0 = 0 + 1;
и, конечно, это невозможно.
то есть. он должен быть l-value
для назначения ему.
GetInt() ++;
Аналогичная причина здесь.
Ответ 8
Потому что 0
является rValue
(т.е. вы можете использовать его только справа от оператора присваивания) not a lValue
.
Оператор ++
увеличивает значение и устанавливает его себе, поэтому 0++
даст вам ошибку.
Ответ 9
postincrement и preincrement могут применяться только с помощью переменной. Таким образом, первый случай компилируется.
Ответ 10
Отвечаю на это "из коробки".
Когда я сомневаюсь в использовании оператора, я думаю, "что его перегруженная функция эквивалентна" этого оператора?
Я знаю, что 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() ++", не являются ссылками на переменные.
Приветствия.
Ответ 11
Так как функция return является выражением RHS, и операции pre/post increment/decment могут применяться только к выражениям LHS.