Подтвердить что ты не робот

Почему оператор 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;?

Недопустимый аргумент для операции ++/-

4b9b3361

Ответ 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.