Страницы

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

вторник, 10 декабря 2019 г.

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

#c #указатели #синтаксис


Есть три (независимые) строчки кода:

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.

Объясните, пожалуйста, почему на самом деле я получаю ошибку компиляции, и какая
разница между первыми двумя строчками кода и третьей, а так же что является операндом
для постфиксного инкремента (указатель или разлинованная область).
    


Ответы

Ответ 1



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

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

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