2013-11-13 3 views
1

Почему я получаю сообщение об ошибке для:ява операторы префикса/постфикса

int i=0; 
++i++; 

Что означает эта ошибка?

unexpected type ++i++;      
    required: variable 
    found: value 
+5

'++ i' разрешает значение. Вы не можете применить оператор '++' к значению. –

+0

Нет типа с комбинацией префикса и постфикса ++ i ++; – Masudul

+1

Я думаю, что это довольно интересный вопрос с учетом ответов. Почему downvote? –

ответ

4

Это о lvalue (левое значение). Lvalue - это то, что на левой стороне «=» может остаться. Кроме того, к чему вы можете придать значение. Например, вы не можете присвоить значение «4», но вы можете указать значение «i». Выражения переменных не только такие lvalues ​​(за исключением некоторого очень эзотерического языка программирования).

Если вы пишете «++ i ++», он будет интерпретироваться как (++ i) ++ или ++ (i ++). «i» - это значение lvalue, но «i ++» или «++ i» нет, потому что это выражения.

В C++, с некоторыми сложными перегрузками оператора и трюками контрольной переменной, компилятор C++ может быть обманут, чтобы справиться с этим правильно.

+0

Это качество/усилие, поставленные в вопрос, который получает downvoted IMO. – redFIVE

+1

Он будет * всегда * интерпретироваться как ++ (i ++) из-за ассоциативности, но +1 для разговоров о lvalues. – Bathsheba

1

++i++; недействителен. Вы можете делать только одно за раз. ++ в префиксе или ++ в postfix.
Я вижу, что вы пытаетесь увеличить значение на два. Вы можете сделать это следующим образом:

i++ // will post-increment the value of i 
++i // will pre-increment the value of i 

i++ таким же, как i = i + 1 или i += 1. Следовательно, вам нужна переменная, для которой это значение может быть сохранено, как указал Sotirios Delimanolis в комментариях.

3

Обе версии префикса и суффикса требуют, чтобы операция выполнялась с переменной, а не значением. Вы можете прирастить переменную i с помощью i++ или ++i, но вы не можете увеличивать числовых символов 5 или 3.14.

++i++ означает, что вы пытаетесь, чтобы увеличить i на единицу, а затем увеличиваем полученное значение один. Есть ошибка.

4

С ++ постфикс и префикс имеют тот же приоритет, нам нужно обратиться к ассоциативности, чтобы выяснить, что происходит.

Ассоциативность ++ находится справа налево.

Это означает, что, концептуально, i++ бывает первым. Но это, конечно, фиксированное значение (это значение i до инкремента). Поэтому префикс ++ будет терпеть неудачу, поскольку он не может работать с фиксированным значением.

+0

Действительно ли это законное, но неопределенное поведение на C++? Я бы подумал, что это тоже незаконно. –

+0

@Ted Hopp: вы правы: он не будет компилироваться в C++ (не lvalue). Я думал больше обо всех материалах i ++ + ++ i, которые вы часто видите, что является UB на C++, но четко определенном на Java. Согласитесь, что мой ответ является неточным, поэтому внесет поправки. – Bathsheba

4

++i или i++ могут быть использованы на переменную, но не по значению, так

i++ 
++i 

в порядке, но

2++ 
++2 

нет.Также результат ++i или i++ не изменяется i но значение (например, для i=1i++ изменят i к 2, но будет возвращать значение 1), так что даже делать что-то вроде

(++i)++ 

было бы неправильно, потому что после того, как ++i вы бы просто попробовать использовать ++ по результату ++i, который может быть, например, 2, поэтому вы бы постарались выполнить 2++. Аналогичный сценарий относится к ++(i++)

Смежные вопросы