Указатели: разница между * p ++ как lvalue и rvalue - PullRequest
0 голосов
/ 02 ноября 2018

Так что меня смущает одна вещь, связанная с указателями. Давайте посмотрим на это:

*p++

Я знаю, что operator ++ "больше" (извините, я не знаю, как сказать, я не являюсь носителем английского языка), чем operator *. Это означает, что * p ++ фактически воспринимается как * (p ++). Так что меня смущает другой результат, когда * p ++ используется как lvalue и rvalue. Например:

Если я хочу суммировать все элементы массива, это будет нормально работать (используется как значение):

sum += *p++;

Мой вопрос здесь: почему это происходит сначала * p, а затем p ++, когда ++ больше *. Почему это сначала не произойдет p ++, а затем * p.

Но если я использую его как lvalue, он работает так, как я ожидал. Например:

*p++ = round(*p * 100) / 100;

Сначала происходит p ++, а затем этот новый номер присваивается * p.

Почему эти две вещи отличаются, когда они используются как rvalue и lvalue, я имею в виду, что я не понимаю, почему этот пример с суммой.

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Постфикс ++ имеет более высокий приоритет , чем унарный *, поэтому *p++ анализируется как *(p++). Другими словами, вы применяете * к результату из p++.

Результат из p++ является текущим значением p. Поскольку побочный эффект , p увеличивается на 1. При использовании указателей это означает, что p обновляется, чтобы указывать на следующий объект в последовательности. IOW, если у вас есть такая ситуация:

+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
  ^
  +---+
      |
    +---+
 p: |   |
    +---+

затем после выполнения p++ (или p = p + 1) у вас будет это:

+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
      ^ 
      |
      |
    +---+
 p: |   |
    +---+

Это верно независимо от типа объектов в последовательности, поэтому значение адреса , сохраненное в p, может быть увеличено более чем на 1.

0 голосов
/ 02 ноября 2018

Приоритет операторов говорит нам, как структурировать выражение. Скобки могут быть использованы для отображения структуры, поэтому sum += *p++ равно sum += (*(p++)).

При оценке выражения мы используем значение каждого оператора, также называемое его семантикой .

  • Значение постфикса ++, как и в p++, это «Делать две вещи по отдельности: получить текущее значение операнда и использовать его в качестве значения этого выражения. И увеличьте операнд ». Таким образом, с p++ значение выражения равно p, а отдельно p увеличивается. Приращение не влияет на значение выражения; это p до приращения.
  • Значение унарного * означает «Разыменовать указатель». Таким образом, результат *(p++) равен *p, на который указывает объект p (без приращения).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...