В 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?