в чем разница между +*var++ и ++Var++?

В чем разница между +*var++ и ++var++? почему ++*var++ работает, а ++var++ приводит к ошибке lvalue required в C?


person Senthilkumar    schedule 28.06.2018    source источник
comment
Вы не упомянули тип var   -  person jaggedSpire    schedule 28.06.2018
comment
Я не вижу никакой актуальности предложенного дублирующего вопроса   -  person Ctx    schedule 28.06.2018
comment
@Ctx, этот дубликат более уместен: stackoverflow.com/questions/8208021/   -  person Umaiki    schedule 28.06.2018
comment
@Umaiki Да, может быть, но в моих глазах он все еще не считается полным дубликатом. Давайте снова откроемся, ответ Вирсавии в порядке   -  person Ctx    schedule 28.06.2018
comment
Ребята, это имеет мало общего с точками последовательности. Здесь изменяются два объекта, а не один дважды. Я снова открылся.   -  person Bathsheba    schedule 28.06.2018
comment
@Senthilkumar Откуда взялись эти два выражения? Вы нашли их в реальной программе? Были ли они частью классного задания? Или вы экспериментируете со всеми перестановками и комбинациями префикса ++, постфикса ++ и *, чтобы убедиться, что вы понимаете, что они все делают? Если вы экспериментируете, я должен вас предостеречь: многие из комбинаций (например, две, о которых вы спрашивали) настолько бессмысленны, что экспериментирование с ними вряд ли научит вас чему-то полезному, это может только еще больше запутать вас.   -  person Steve Summit    schedule 28.06.2018
comment
@Senthilkumar почему ++*var++ работает Если вы думаете, что это работает, вы бы знали, что оно делает. Если вы где-то нашли этот код, избавьтесь от него. Удалите его с жесткого диска. Затем вытащите этот жесткий диск, расплавьте его в небольшой металлический шарик и начните работу GoFundMe, чтобы НАСА или какое-либо другое космическое агентство запустило остатки вашего жесткого диска на Солнце, просто чтобы избавить его от страданий, которые он должен испытать. переживать за проведение такого кода.   -  person Andrew Henle    schedule 28.06.2018
comment
Пожалуйста, никогда не пишите такой код.   -  person Jesper Juhl    schedule 28.06.2018


Ответы (2)


++var++ группируется как ++(var++), что приводит к ошибке компиляции, поскольку var++ не является lvalue. (Неформально это означает, что вы не можете поместить его в левую часть задания).

++*var++ группируется как ++(*(var++)), что означает увеличение указателя var на 1 с помощью арифметики указателей, а затем увеличение разыменованного значения начального значения var на 1.

person Bathsheba    schedule 28.06.2018
comment
Дополнительное чтение: Что такое rvalues, lvalues, xvalues, glvalues ​​и prvalues? - person user4581301; 28.06.2018

Несмотря на то, что я просто советовал против этого в комментарии, может быть полезно рассмотреть все возможности. Для переменной-указателя p имеем:

  1. ++p увеличить p, получить новое значение
  2. p++ приращение p, вернуть старое значение
  3. *++p увеличить p, получить доступ к тому, на что он указывает
  4. *p++ увеличить p, получить доступ к тому, на что он раньше указывал
  5. ++*p увеличивает то, на что указывает p, дает новое значение
  6. (*p)++ увеличить то, на что указывает p, вернуть старое значение
  7. ++*++p приращение p, увеличение того, на что он указывает, дает новое значение
  8. (*++p)++ увеличить p, увеличить то, на что он указывает, вернуть старое значение
  9. ++(*p++) приращение p, увеличение того, на что раньше указывало, получение нового значения
  10. (*p++)++ увеличить p, увеличить то, на что раньше указывало, вернуть старое значение
  11. ++p++ бессмысленно

Вы спрашивали о случаях 9 и 11. В случае 9 я добавил явные круглые скобки, чтобы было более понятно, что происходит. Я думаю, это также сработает, если вы опустите их и скажете ++*p++, но у меня от этого голова взорвется, поэтому я бы предпочел больше не думать об этом.

person Steve Summit    schedule 28.06.2018