Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Ошибка lvalue required as left operand of assignment

Есть три (независимые) строчки кода:
1) *a++ = 5; 2) *(a++) = 5; 3) (*a)++ = 5;
Первая и вторая строчки работают одинаково. На третью компилятор (minGW, GCC) ругается:
lvalue required as left operand of assignment (*a)++=5;
Не могу понять почему. Теоретически она не должна отличаться от первых двух: разыменовываем указатель a, присваиваем новое значение, выполняем постфиксный инкремент указателя. Расстановка скобок в левой части не должна влиять на порядок выполнения, но такое впечатление, что в третьем случае влияет, и код выглядит так:
((*a) + 1) = 5;
Только в таком случае действительно не выполняется условие lvalue
Объясните, пожалуйста, почему на самом деле я получаю ошибку компиляции, и какая разница между первыми двумя строчками кода и третьей, а так же что является операндом для постфиксного инкремента (указатель или разлинованная область).


Ответ

*a++ = 5;
Сначала применение ++ к a, возврат старого указателя, разыменование, присвоение.
*(a++) = 5;
Сначала инкремент, который возвращает старый указатель, который разыменовывается, и по этому адресу выполняется присваивание (все, как в первой строке).
(*a)++ = 5;
Разыменование, получаем значение, к которому применяем ++... к чему? К разыменованному значению указателя? OK, но что при этом вернуть? Просто старое значение в памяти по этому адресу?
Ссылок в C нет, это не C++. Значит, вернуть просто старое значение 5? Но это не lvalue! на что, сообственно, и указывает компилятор....
По-моему, так (с) Пух

Комментариев нет:

Отправить комментарий