Розглянемо наступний код:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Він компілюється із наступним помилкою:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Це звучить для мене справедливо. Приріст постфікса має більший пріоритет, ніж приріст префікса, тому код аналізується як int b = ++(i++);
і i
є оцінкою. Звідси помилка.
Давайте тепер розглянемо цей варіант із дужками для того, щоб змінити пріоритети за замовчуванням:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Цей код складається і повертається 3. Сам по собі це звучить справедливо для мене, але це здається всупереч першому коду.
Питання: чому (++i)
це lvalue
коли i
немає?
Дякую!
ОНОВЛЕННЯ: наведене вище повідомлення про помилку було від gcc (x86-64 9.2). Ось точне відображення: помилка з gcc
Clang x86-64 9.0.0 має зовсім інше повідомлення: помилка з клангом
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
З GCC у вас складається враження, що проблема полягає в операторі Postfix, і ви можете потім поглянути, чому ++i
це нормально, а i
ні, звідси і моє запитання. З Кланг зрозуміліше, що проблема в операторі префікса.