В Java, почему я не могу написать i ++++ или (i ++) ++? - PullRequest
7 голосов
/ 11 января 2011

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

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

PostIncrementExpression:
        PostfixExpression ++

и

PostfixExpression:
        Primary
        ExpressionName
        PostIncrementExpression
        PostDecrementExpression

так писать:

PostfixExpression ++ ++

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

Ответы [ 10 ]

23 голосов
/ 11 января 2011

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

Постфиксное увеличение приводит к значению r - и точно так же, как вы не можете использовать постфиксное увеличениелитералы, вы не можете постфиксно увеличивать результат i++.

Цитирование из JLS (3 rd ред., стр. 486):

Результатом выражения приращения постфикса является не переменная, а значение.

8 голосов
/ 11 января 2011

Ошибка говорит вам ответ:

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

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

5 голосов
/ 11 января 2011

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

4 голосов
/ 23 июля 2013

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

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

открытый классA {public void test () {int i = 0;i = (i ++) ++;}}

Вывод компиляции:

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

2 голосов
/ 11 января 2011

i ++ по сути является сокращением для:

(i = i + 1)

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

(i = i+1) ++;

верно?:)

1 голос
/ 06 апреля 2015

Необходимо помнить: Оператор увеличения и уменьшения (префикс и постфикс) всегда работает с переменная не значение

Здесь я объясню это одним exe:

int i = 0;

int j = (i++)++;

выше exe.

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

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

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

1 голос
/ 11 января 2011

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

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

0 голосов
/ 14 июля 2011

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

i+=2

Там.

0 голосов
/ 11 января 2011

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

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

0 голосов
/ 11 января 2011

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

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

Использование Looping

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

...