Что делает "* ptrInt ++"? - PullRequest
       1

Что делает "* ptrInt ++"?

8 голосов
/ 03 июля 2011

Я реализую оболочку указателя шаблона, по функциональности похожую на boost::shared_ptr.

У меня есть указатель на целое число ptrInt.

Что я хочу сделать: Увеличить целое число, на которое указывает ptrInt.

Мой исходный код был таким: *ptrInt ++;, хотя я тоже пытался сделать это, используя (*ptrInt) ++;

Однако, по-видимому, похоже, это не соответствует ожиданиям. В конце концов я заработал, используя *ptrInt += 1;, но я спрашиваю себя:

  • Что именно *ptrInt ++; делает?
  • Есть ли более элегантное решение для использования *ptrInt += 1;?

Ответы [ 8 ]

9 голосов
/ 03 июля 2011
*p++    // Return value of object that p points to and then increment the pointer
(*p)++  // As above, but increment the object afterwards, not the pointer
*p += 1 // Add one to the object p points to

Последние два параметра увеличивают объект, поэтому я не уверен, почему вы не думаете, что он работает.Если выражение используется в качестве значения, окончательная форма будет возвращать значение после увеличения, но другие возвращают значение раньше.

x = (*p)++; // original value in x

(*p)++;
x = *p;     // new value in X

или

x = ++*p;   // increment object and store new value in x
4 голосов
/ 03 июля 2011

*ptr++ эквивалентно *(ptr++)

3 голосов
/ 03 июля 2011

*ptrInt ++ будет

  1. с увеличением ptrInt на 1

  2. разыменование старого значения ptrInt

и (*ptrInt) ++, а также *ptrInt += 1 будут делать то, что вы хотите.

См. Приоритет оператора .

1 голос
/ 03 июля 2011

(* ptr) ++ должен делать это, если вы не используете его значение сразу.Затем используйте ++ * ptr, что эквивалентно ++ (* ptr) из-за ассоциативности справа налево.

В примечании, , вот моя реализация интеллектуального указателя ,возможно, это поможет вам в написании вашего собственного.

0 голосов
/ 03 июля 2011

Элегантный способ больше - это то, что вы пробовали раньше.то есть (*ptrInt) ++;

Так как, вы не удовлетворены этим, это может быть из-за постинкремента.

Скажем, std::cout<<(*ptrInt) ++; показал бы вам неинкрементное значение.

Итак, попробуйте дать ++(*ptrInt);, который может вести себя так, как вы ожидали.

0 голосов
/ 03 июля 2011

Вы хотите (*ptrInt)++, который увеличивает объект, что обычно делает то же самое, что и *ptrInt += 1.Может быть, вы перегрузили оператор +=, но не операторы ++ (операторы постфиксного и префиксного приращения)?

0 голосов
/ 03 июля 2011

Выражение вычисляется с использованием правил для приоритета операторов.

Постфиксная версия ++ (та, где ++ идет после переменной) имеет более высокий приоритет, чем оператор * (косвенное обращение).

Именно поэтому *ptr++ эквивалентно *(ptr++).

0 голосов
/ 03 июля 2011

*ptrInt++ в вашем случае увеличивает значение указателя, ничего более (до этого он выбирает значение из местоположения, выбрасывает его. Конечно, если вы используете его в более сложном выражении, он будет его использовать)

(*ptrInt)++ делает то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...