Классификация выражений как lvalue или rvalue

Категории значений относятся к выражениям, а не к объявлениям целиком. a и b — lvalue; a + b, a + 1 и &a — prvalue. Разыменование корректного указателя даёт lvalue.

Короткий ответ

Что ответить на собеседовании

Категории значений относятся к выражениям, а не к объявлениям целиком. 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее