#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! на что, сообственно, и указывает компилятор.... По-моему, так (с) Пух
Комментариев нет:
Отправить комментарий