Категории значений относятся к выражениям, а не к объявлениям целиком. a и b — lvalue; a + b, a + 1 и &a — prvalue. Разыменование корректного указателя даёт lvalue.
Классификация выражений как lvalue или rvalue
Категории значений относятся к выражениям, а не к объявлениям целиком. a и b — lvalue; a + b, a + 1 и &a — prvalue. Разыменование корректного указателя даёт lvalue.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо пройтись по приведённому фрагменту кода построчно и для каждой строки указать, относится ли получаемое выражение к категории lvalue или rvalue.
int a = 1;
int b = 1;
int c = a + b;
int* bad_adr = &(a + 1);
int* adr = &a;
&a = 40;
*(p + 1) = 10;
Ответ
Категории значений относятся к выражениям, а не к объявлениям целиком. a и b — lvalue; a + b, a + 1 и &a — prvalue. Разыменование корректного указателя даёт lvalue.
int c = a + b; корректно инициализирует c результатом вычисления. В &(a + 1) пытаются взять адрес prvalue встроенным оператором &, что недопустимо. Присваивание &a = 40 тоже некорректно: результат взятия адреса не является изменяемым lvalue.
В *(p + 1) = 10 левая часть — lvalue, но p в показанном коде вообще не объявлен. Даже после объявления нужно обеспечить, что p + 1 указывает на доступный изменяемый элемент массива.
Источник: eel.is.