В Java, почему я не могу написать i++++ или (i++)++?

когда я пытаюсь написать постфикс / префикс в / decrement, а затем пост / префикс в / decrement, я получаю следующую ошибку:недопустимый аргумент для операции ++/--.

но, согласно JLS:

PostIncrementExpression:
        PostfixExpression ++

и

PostfixExpression:
        Primary
        ExpressionName
        PostIncrementExpression
        PostDecrementExpression

Итак, пишем:

PostfixExpression ++ ++

должно быть возможно... Есть мысли?

10 ответов


обратите внимание, что в необработанной грамматике отсутствует семантика. Это просто синтаксис, и не каждая синтаксически допустимая программа обычно будет действительной. Например, требование о том, что переменные должны быть объявлены перед использованием, обычно не охватывается грамматикой (вы можете, но это громоздко).

Postfix-increment дает rvalue - и так же, как вы не можете литералы postfix-increment, вы не можете postfix-increment результат i++.

цитирование из JLS (3rd ed. стр. 486):

результатом выражения postfix increment является не переменная, а значение.


ошибка сообщает вам ответ:

unexpected type
required: variable
found   : value
        (i++)++;

таким образом, i++ вычисляет значение, в то время как оператор требует переменной.


вы можете применять только ++ или -- к выражению, которое обозначает изменяемое местоположение (lvalue). Результат a ++ или -- - это значение из местоположения (rvalue -- до или после увеличения или уменьшения), а не само изменяемое местоположение. Так что ты не можешь сказать (a++)++ больше, чем вы можете сказать (a+b)++ -- нет места, которое нужно изменить.


проблема с этим выражением i = (i++)++; Это (i++) получает разрешение на значение и определение ++ оператор говорит, что 1 . он увеличит указанную переменную и поставит/вернет значение для этого, используете ли вы постфикс или префикс. 2. этот оператор требует переменной, будь то префикс или постфикс. Но то, что происходит здесь (i++), возвращает значение и ставит его на место (i++) , а затем у вас есть (значение)++ и (значение) не является ожидаемым типом для этого оператора, поскольку для него требуется переменная вместо значения.

например, в Java, если вы скомпилировать следующий фрагмент кода Вы получите ошибку, как показано после фрагмент:

публичный класс A{ тест общественного недействительными (){ int i =0; i = (i++)++; } }

сборник выход :

A. java: 4: неожиданный тип требуется: переменная найдено : значение i = (i++)++; ^ Ошибка 1


i++ - это в основном ярлык для:

(i = i+1)

и не имело бы никакого смысла писать:

(i = i+1)++;

верно? :)


каким должен быть результат такой операции? Результат i++ является (копией) текущего значения i и i затем увеличивается (в должности). Итак, как вы представляете себе увеличение результата i++ в очередной раз? Если i первоначально было 1, Каким должно быть его значение после i++++, и каков должен быть результат этой операции?

если вы думаете об этом, вы, вероятно, понимаете, что это было бы очень трудно определить это правильно. Поскольку разработчики Java намеревались избежать" неопределенных " ловушек C / C++ (и поскольку значение такого утверждения в лучшем случае сомнительно), они, вероятно, решили явно запретить его.


Должны Помнить: оператор Increment & decrement (prefix & postfix) всегда работает с переменная не стоимостью

вот я объясняю это с помощью одного exe:

int i = 0;

int j = (i++)++;

выше exe-файла.

инициализировать значение Я С 0(ноль)

на (i++) '++' работа с I, которая является переменной и после выполнения операции возврата (1)

сейчас (1)++ ' ++ ' работа с (1), которая является значением не переменной, которая противоречит правилам java, поэтому ошибка времени компиляции генерирует недопустимый аргумент для операции ++/--


чего вы пытаетесь достичь с помощью (i++)++ ?

увеличить его в два раза!!

Использовать Циклические

инкремент внутри цикла :)


в i++ ++ является постфиксным оператором, поэтому он возвращает значение i, а затем увеличивает его. Что бы вы хотели (i++)++ сделать? Должен ли он возвращать i+1 с (i++ == i)? Если нет, не было бы странно, что i++=i но (i++)++ != i) рассмотрим следующие выражения:

i++  ==  i;   // true
j = i++  // j gets the value of i
j++ == i //  still true since j== i

(i++) ++ ==  j ++    //  what should be the answer here?

вы рассматривали i+=2?


почему бы вам просто не использовать оператор приращения стенографии?

i+=2

там.