В чем разница между +*var++ и ++var++? почему ++*var++ работает, а ++var++ приводит к ошибке lvalue required в C?
в чем разница между +*var++ и ++Var++?
Ответы (2)
++var++
группируется как ++(var++)
, что приводит к ошибке компиляции, поскольку var++
не является lvalue
. (Неформально это означает, что вы не можете поместить его в левую часть задания).
++*var++
группируется как ++(*(var++))
, что означает увеличение указателя var
на 1 с помощью арифметики указателей, а затем увеличение разыменованного значения начального значения var
на 1.
Несмотря на то, что я просто советовал против этого в комментарии, может быть полезно рассмотреть все возможности. Для переменной-указателя p
имеем:
++p
увеличитьp
, получить новое значениеp++
приращениеp
, вернуть старое значение*++p
увеличитьp
, получить доступ к тому, на что он указывает*p++
увеличитьp
, получить доступ к тому, на что он раньше указывал++*p
увеличивает то, на что указываетp
, дает новое значение(*p)++
увеличить то, на что указываетp
, вернуть старое значение++*++p
приращениеp
, увеличение того, на что он указывает, дает новое значение(*++p)++
увеличитьp
, увеличить то, на что он указывает, вернуть старое значение++(*p++)
приращениеp
, увеличение того, на что раньше указывало, получение нового значения(*p++)++
увеличитьp
, увеличить то, на что раньше указывало, вернуть старое значение++p++
бессмысленно
Вы спрашивали о случаях 9 и 11. В случае 9 я добавил явные круглые скобки, чтобы было более понятно, что происходит. Я думаю, это также сработает, если вы опустите их и скажете ++*p++
, но у меня от этого голова взорвется, поэтому я бы предпочел больше не думать об этом.
var
- person jaggedSpire   schedule 28.06.2018++
, постфикса++
и*
, чтобы убедиться, что вы понимаете, что они все делают? Если вы экспериментируете, я должен вас предостеречь: многие из комбинаций (например, две, о которых вы спрашивали) настолько бессмысленны, что экспериментирование с ними вряд ли научит вас чему-то полезному, это может только еще больше запутать вас. - person Steve Summit   schedule 28.06.2018++*var++
работает Если вы думаете, что это работает, вы бы знали, что оно делает. Если вы где-то нашли этот код, избавьтесь от него. Удалите его с жесткого диска. Затем вытащите этот жесткий диск, расплавьте его в небольшой металлический шарик и начните работу GoFundMe, чтобы НАСА или какое-либо другое космическое агентство запустило остатки вашего жесткого диска на Солнце, просто чтобы избавить его от страданий, которые он должен испытать. переживать за проведение такого кода. - person Andrew Henle   schedule 28.06.2018