Was macht "* ptrInt ++"?

8

Ich implementiere einen Template-Pointer-Wrapper, ähnlich wie boost::shared_ptr .

Ich habe einen Zeiger auf eine Ganzzahl ptrInt .

Was ich tun möchte: Erhöht die Ganzzahl ptrInt auf.

Mein ursprünglicher Code war dies: *ptrInt ++; , obwohl ich das auch mit (*ptrInt) ++;

versucht habe

Offenbar scheint dies jedoch nicht das zu tun, was ich erwartet habe. Am Ende habe ich es mit *ptrInt += 1; arbeiten lassen, aber ich frage mich:

  • Was genau macht *ptrInt ++; ?
  • Gibt es eine elegantere Lösung für die Verwendung von *ptrInt += 1; ?
Klitschko 02.07.2011, 20:27
quelle

8 Antworten

9
%Vor%

Die letzten beiden erhöhen beide das Objekt, also bin ich mir nicht sicher, warum du nicht gedacht hast, dass es funktioniert. Wenn der Ausdruck als Wert verwendet wird, gibt das letzte Formular den Wert nach dem Inkrementieren zurück, während die anderen den Wert vorher zurückgeben.

%Vor%

oder

%Vor%     
DigitalRoss 02.07.2011 20:32
quelle
4

*ptr++ entspricht *(ptr++)

    
Alok Save 02.07.2011 20:32
quelle
3

*ptrInt ++ wird

  1. erhöht ptrInt um 1

  2. Dereferenz alter Wert von ptrInt

und (*ptrInt) ++ sowie *ptrInt += 1 werden tun, was Sie wollen.

Siehe Vorrang für den Operator .

    
kilotaras 02.07.2011 20:35
quelle
1

(* ptr) ++ sollte es tun, es sei denn, Sie verwenden den Wert sofort. Verwenden Sie dann ++ * ptr, was aufgrund der Assoziation von rechts nach links mit ++ (* ptr) gleichzusetzen ist.

Nebenbei bemerkt, hier ist meine intelligente Pointer-Implementierung , vielleicht kann sie Ihnen helfen Schreiben Sie Ihre eigenen.

    
Frigo 03.07.2011 08:27
quelle
0

Der Ausdruck wird anhand der Regeln für die Rangfolge der Operatoren ausgewertet.

Die Postfix-Version von ++ (diejenige, in der ++ hinter der Variable steht) hat eine höhere Priorität als der * -Operator (Indirection).

Deshalb ist *ptr++ gleichbedeutend mit *(ptr++) .

    
Andrei 02.07.2011 20:37
quelle
0

Sie möchten (*ptrInt)++ , was das Objekt inkrementiert, was im Allgemeinen dasselbe wie *ptrInt += 1 ist. Vielleicht haben Sie den Operator += überladen, aber nicht die Operatoren ++ (Inkrementoperatoren für Postfix und Präfix)?

    
Antti 02.07.2011 20:38
quelle
0

Der more elegante Weg ist, was auch immer Sie zuvor versucht haben. d. h. (*ptrInt) ++;

Da Sie damit nicht zufrieden sind, könnte es am Post-Inkrement liegen.

Angenommen, std::cout<<(*ptrInt) ++; hätte Ihnen den nicht inkrementierten Wert angezeigt.

Versuchen Sie also, ++(*ptrInt); anzugeben, was sich möglicherweise wie erwartet verhält.

    
liaK 02.07.2011 20:40
quelle
-1

*ptrInt++ erhöht in Ihrem Fall den Zeiger, nichts mehr (bevor er den Wert von der Position abliest, wird er weggeworfen. Natürlich, wenn Sie ihn in einem komplexeren Ausdruck verwenden, wird er ihn benutzen)

(*ptrInt)++ macht, was Sie suchen.

    
Karoly Horvath 02.07.2011 20:34
quelle

Tags und Links