2011-01-10 4 views
7

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

Но, по словам JLS:

PostIncrementExpression: 
     PostfixExpression ++ 

и

PostfixExpression: 
     Primary 
     ExpressionName 
     PostIncrementExpression 
     PostDecrementExpression 

так пишут:

PostfixExpression ++ ++ 

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

+4

Что возвращает 'i ++'? –

+5

Вам не кажется, что '- ++ ---- ++ var ++ ---- ++ - ++' может быть немного запутанным? – Crozin

+3

Учитывая, что приращение C++ является C#, вы пытались использовать 'i #'? ;-) –

ответ

23

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

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

Цитируя JLS (3 й изд стр. 486):

The result of the postfix increment expression is not a variable, but a value.

+0

Вы можете кодировать декларацию перед использованием в грамматик? Для любого числа любых идентификаторов? – delnan

+0

@ delnan: грамматики Ван Вайнгаарда были задуманы для таких вещей, да. Но для всех практических целей двухуровневые грамматики громоздки, и вы можете достичь большей части того же с помощью простой атрибутивной грамматики, которая определяет утверждения, которые распространяются по АСТ (если я правильно помню, прошло уже несколько лет с этого класса). – Joey

0

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

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

Применение Looping

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

+3

Ugghh. Разумеется, 'i + = 2' лучше, чем цикл. –

1

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

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

+0

Нет, это не почему. Причина, о которой говорится в других ответах, заключается в том, что результатом выражения i ++ является значение, а не ссылка, которую можно изменить. –

+0

@ Джон, так что же тогда вопрос вашего вопроса? –

+0

Я помнил это из-за комментариев/ответов. –

8

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

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

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

+2

Хм, в зависимости от компилятора, я думаю. EclipseC дает »Недопустимый аргумент для операции ++/-«, который не так полезен. – Joey

+0

Интересно. Да, это не так полезно. Ошибка выше от компилятора Sun. – JOTN

5

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

0

В i ++ ++ является постфиксным оператором, поэтому он возвращает значение i, а затем увеличивает его. Что бы вы хотели (i ++) ++ делать? Должен ли он возвращать i + 1, поскольку (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?

2

я ++ в основном ярлык для:

(I = I + 1)

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

(я = я + 1) ++ ;

правый? :)

+3

'(i = i + 1)' is * not * такое же поведение, как '(i ++)' - первое возвращает новое значение i, последнее возвращает старое. –

+0

Извините. Наверное, я не выбрал хороший смайлик, который передает грандиозность. Моя вина. -1 для себя за это. – Kylar

0

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

i+=2 

Существует.

4

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

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

общественного класса А { общественного недействительными тест() { INT I = 0; i = (i ++) ++; }}

выход

компиляции:

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

1

должен помнить: Increment & декремента (префикс & постфикса) оператор всегда работает с переменных не значения

Здесь я объяснить это одним еха :

int i = 0; 

int j = (i++)++; 

над exe.

initialize value of i with 0(zero)

in (i++) '++' work with i which is variable & after performing operation return (1)

now in (1)++ '++' work with (1) which is value not variable that is oppose to rules of java that's why compile time error generate Invalid argument to operation ++/--