В чем разница между ++ * var ++ и ++ Var ++? - PullRequest
0 голосов
/ 28 июня 2018

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

Ответы [ 2 ]

0 голосов
/ 28 июня 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++, но это заставит мою голову взорваться, поэтому я предпочел бы больше об этом не думать.

0 голосов
/ 28 июня 2018

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

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

...