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