Erhöhen Sie den Wert von int, auf den der Zeiger zeigt
Lesezeit: 2 Minuten
joels
ich habe ein int Zeiger (dh int *count), dass ich die ganze Zahl erhöhen möchte, auf die gezeigt wird, indem ich die verwende ++ Operator. Ich dachte, ich rufe an:
*count++;
Allerdings bekomme ich eine Build-Warnung “Ausdrucksergebnis unbenutzt”. Ich kann anrufen
*count += 1;
Aber ich würde gerne wissen, wie man die verwendet ++ Betreiber ebenso. Irgendwelche Ideen?
Doug T.
Das ++ hat den gleichen Vorrang wie das * und die Assoziativität ist rechts nach links. Sehen hier. Es wird noch komplexer, denn obwohl das ++ mit dem verknüpft wird Zeiger das Inkrement wird nach der Auswertung der Anweisung angewendet.
Die Reihenfolge, in der Dinge passieren, ist:
Nach dem Inkrement wird der nach-inkrementierte Pointer-Adresswert temporär gespeichert
Nicht inkrementierte Zeigeradresse dereferenzieren
Wenden Sie die inkrementierte Zeigeradresse auf count an, count zeigt nun auf die nächste mögliche Speicheradresse für eine Entität ihres Typs.
Sie erhalten die Warnung, weil Sie den dereferenzierten Wert in Schritt 2 nie wirklich verwenden. Wie @Sidarth sagt, benötigen Sie Klammern, um die Reihenfolge der Auswertung zu erzwingen:
(*ptr)++
Ich würde hinzufügen, dass ich diesen Fall immer als schreibe ++*ptr; weil die Priorität eindeutig ist und wenn das Ergebnis nicht verwendet wird, muss nicht zwischen Präinkrement und Postinkrement unterschieden werden.
– RBerteig
7. September 2010 um 6:52 Uhr
@RBerteig: Es mag für den Compiler eindeutig sein, aber es ist immer noch verwirrend für einen Menschen. Es ist viel besser, Klammern zu verwenden, da dies das Lesen erleichtert.
– Martin York
7. September 2010 um 11:37 Uhr
@RBerteig: Falls du das behauptest ++*ptr ist leichter zu lesen als ++(*ptr) dann hoffe ich, dass Sie bei Ihrem nächsten Code-Review eine Ohrfeige bekommen.
– Martin York
7. September 2010 um 18:56 Uhr
Das behaupte ich, und das seit ~25 Jahren. Noch keine Schläge.
– RBerteig
7. September 2010 um 22:09 Uhr
@RBerteig: Ein halbes Jahrhundert Lisp widerspricht dir. 😉
– Deniz Dogan
22. September 2010 um 13:00 Uhr
Sidharth Panwar
Versuchen Sie es mit (*count)++. *count++ könnte den Zeiger auf die nächste Position erhöhen und dann eine Indirektion verwenden (was unbeabsichtigt ist).
14178600cookie-checkErhöhen Sie den Wert von int, auf den der Zeiger zeigtyes