Вопрос

Когда я пытаюсь написать 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

Там.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top