Почему я получаю сообщение об ошибке для:ява операторы префикса/постфикса
int i=0;
++i++;
Что означает эта ошибка?
unexpected type ++i++;
required: variable
found: value
Почему я получаю сообщение об ошибке для:ява операторы префикса/постфикса
int i=0;
++i++;
Что означает эта ошибка?
unexpected type ++i++;
required: variable
found: value
Это о lvalue (левое значение). Lvalue - это то, что на левой стороне «=» может остаться. Кроме того, к чему вы можете придать значение. Например, вы не можете присвоить значение «4», но вы можете указать значение «i». Выражения переменных не только такие lvalues (за исключением некоторого очень эзотерического языка программирования).
Если вы пишете «++ i ++», он будет интерпретироваться как (++ i) ++ или ++ (i ++). «i» - это значение lvalue, но «i ++» или «++ i» нет, потому что это выражения.
В C++, с некоторыми сложными перегрузками оператора и трюками контрольной переменной, компилятор C++ может быть обманут, чтобы справиться с этим правильно.
++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 в комментариях.
Обе версии префикса и суффикса требуют, чтобы операция выполнялась с переменной, а не значением. Вы можете прирастить переменную i
с помощью i++
или ++i
, но вы не можете увеличивать числовых символов 5
или 3.14
.
++i++
означает, что вы пытаетесь, чтобы увеличить i
на единицу, а затем увеличиваем полученное значение один. Есть ошибка.
С ++
постфикс и префикс имеют тот же приоритет, нам нужно обратиться к ассоциативности, чтобы выяснить, что происходит.
Ассоциативность ++
находится справа налево.
Это означает, что, концептуально, i++
бывает первым. Но это, конечно, фиксированное значение (это значение i
до инкремента). Поэтому префикс ++
будет терпеть неудачу, поскольку он не может работать с фиксированным значением.
Действительно ли это законное, но неопределенное поведение на C++? Я бы подумал, что это тоже незаконно. –
@Ted Hopp: вы правы: он не будет компилироваться в C++ (не lvalue). Я думал больше обо всех материалах i ++ + ++ i, которые вы часто видите, что является UB на C++, но четко определенном на Java. Согласитесь, что мой ответ является неточным, поэтому внесет поправки. – Bathsheba
++i
или i++
могут быть использованы на переменную, но не по значению, так
i++
++i
в порядке, но
2++
++2
нет.Также результат ++i
или i++
не изменяется i
но значение (например, для i=1
i++
изменят i
к 2
, но будет возвращать значение 1
), так что даже делать что-то вроде
(++i)++
было бы неправильно, потому что после того, как ++i
вы бы просто попробовать использовать ++
по результату ++i
, который может быть, например, 2
, поэтому вы бы постарались выполнить 2++
. Аналогичный сценарий относится к ++(i++)
'++ i' разрешает значение. Вы не можете применить оператор '++' к значению. –
Нет типа с комбинацией префикса и постфикса ++ i ++; – Masudul
Я думаю, что это довольно интересный вопрос с учетом ответов. Почему downvote? –