В Java почему я не могу написать I ++++ или (i ++) ++?
Вопрос
Когда я пытаюсь написать Postfix / Prefix In / Skenement, за которым следует пост / префикс в / уменьшение, я получаю следующую ошибку: Неверный аргумент для работы ++ / -.
Но, по словам JLS:
PostIncrementExpression:
PostfixExpression ++
и
PostfixExpression:
Primary
ExpressionName
PostIncrementExpression
PostDecrementExpression
Так что написать:
PostfixExpression ++ ++
должно быть возможным ... любые мысли?
Решение
Обратите внимание, что сырая грамматика не хватает любой семантики. Это просто синтаксис, а не каждая синтаксически действительная программа, как правило, будет действительной. Например, требование того, что переменные должны быть объявлены перед использованием, обычно не покрываются грамматикой (вы можете, но это громоздко).
Postfix-природок дает rvalue - и точно так же, как вы не можете пособиться-прикручивать литералы, вы не можете Postfix-приращение результата i++
.
Цитируя от JLS (3находка Эд., стр. 486):
Результат выражения постепенного увеличения не является переменной, а значением.
Другие советы
Ошибка сообщает вам ответ:
unexpected type
required: variable
found : value
(i++)++;
Итак, I ++ оценивает значение, пока оператор требует переменной.
Вы можете подать заявку только ++
или --
к выражению, которое обозначает модифицируемое местоположение (Lvalue). Результат ++
или --
Это значение из местоположения (rvalue - либо до или после приращения или уменьшения), а не в себе модифицируемое местоположение. Так что вы не можете сказать (a++)++
больше, чем вы можете сказать (a+b)++
- Нет места для модификации.
Проблема с этим выражением i = (i ++) ++; в том, что (i ++) разрешается на значение и определение ++ Оператор говорит это1 . Он увеличит указанную переменную и поставит / вернет значение для этого, используете ли вы постфикс или префикс.2. Этот оператор требует переменных, будь то префикс или постфикс. Но что здесь происходит (i ++), возвращает значение и помещать его на место (i ++), а затем вы имеете (значение) ++ и (ценность) не ожидаемый тип для этого оператора, поскольку он требует переменной вместо значения.
Например, в Java, если вы компилируете следующий фрагмент кода, вы получите ошибку, как показано после фрагмента:
Открытый класс A {Public Void-тест () {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 ++ «undefined» (и поскольку значение такого утверждения сомневается в лучшем случае), они, вероятно, решили явно запретить его.
Должен помнить: Оператор увеличения и уменьшения (Prefix & Postfix) всегда работают с переменная нет ценность
Здесь я объясню это с одним exe:
int i = 0;
int j = (i++)++;
выше exe.
Инициализируйте значение я с 0 (ноль)
в (I ++) «++» работа с I, которая является переменным и после выполнения возврата операции (1)
Сейчас в (1)++ «++» работа с (1), которая является значением не переменной, которая противоречит правилам Java, поэтому сгенерируют ошибку времени компиляции Неверный аргумент для работы ++ / -
Что вы пытаетесь достичь (i ++) ++?
увеличивать его дважды!
Использовать петли
Приращение внутри цикла :)
В i ++ ++ - оператор Postfix, поэтому он возвращает значение i, а затем увеличиваю его. Что бы вы хотели (I ++) ++ делать? Должен ли он вернуть I + 1 с (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
Там.