LP,
Привет всем! У меня вопрос:
Допустим у нас есть переменная:
int i;
почему нельзя написать инструкцию:
++i++;
Написать-то можно, только компилятор не будет такой код компилировать
Дело в том, что по правилам грамматики С++ это выражение будет разобрано как ++(i++)
Выражение в скобках порождает, как ты правильно заметил, rvalue, а инфиксный оператор ++ требует, чтобы аргумент был lvalue.
тогда как при
i++; или ++i;
все ОК.
И еще, почему
++i считается lvalue, i++ - rvalue? :?
Если по-простому, то lvalue -- это объект, в который можно сохранять информацию. Оператор инкремента (как инфиксный, так и постфиксный) требуют, чтобы их аргумент был lvalue -- ведь оператор изменяет свой аргумент, и это изменение надо куда-то сохранить.
Теперь перейдём к примеру. Переменная i является lvalue, так как с ней связана некоторая постоянная (в рамках области видимости) ячейка памяти. Поэтому к ней можно применять инкремент -- допустимы ++i и i++.
Выражение ++i работает так: значение переменной i увеличивается на 1, сохраняется в переменной и возвращается
сама переменная. Это объяснение, почему ++i даёт lvalue.
Выражение i++ работает иначе -- значение переменной i сохраняется во временной ячейке памяти, затем значение переменной i увеличивается на 1, сохраняется в переменной i, и возвращяется
временный объект с прежним значением i. Временный объект не является хранилищем, которое предназначено для записи новых данных, это rvalue. Вот ответ, почему i++ даёт rvalue.