2014-10-17 21 views
16

Ich bin mir nicht sicher, ob unter Aussage auch durch Standard-C oder nichtIst * p ++ + = 2 gut definiert?

*p1++ += 2; 

oder andere ähnliche Anweisung definiert:

*E1++ <operator>= E2 

Von Standard-C über post-Schritt:

Das Ergebnis des Operators postfix ++ ist der Wert des Operanden. Nachdem das Ergebnis erhalten wurde, wird der Wert des Operanden erhöht. (Das heißt, der Wert 1 des entsprechenden Typs wird hinzugefügt.) Weitere Informationen über Einschränkungen, Typen und Konvertierungen sowie die Auswirkungen von Operationen auf Zeiger finden Sie unter Diskussionen über additive Operatoren und Verbundzuweisung für 10. Der Nebeneffekt der Aktualisierung des gespeicherten Wertes des Operanden soll zwischen der vorherigen und der nächsten Sequenz Punkt auftreten.

Und über coumpund-Zuordnung:

Verbindung Zuweisung der Form E1 op = E2 aus der einfachen Zuweisungsausdruck unterscheidet sich nur E1 = E1 op (E2) daß der L-Wert E1 ist nur einmal bewertet.

+0

Nun, was genau hat Ihren Verdacht ausgelöst, dass es undefiniert sein könnte? Für mich zum Beispiel sieht alles gut aus, was es für mich schwierig macht, überhaupt mit der Beantwortung der Frage zu beginnen: Ich weiß nicht, worauf ich mich konzentrieren soll. – AnT

+2

Schreiben Sie keine Codes in ein Projekt wie dieses, außer dass Sie danach suchen. – wshcdr

+9

Diese Art von unlesbarem Code zu schreiben, nur um mehr Code in einer Zeile zu stopfen, ist eine schlechte Programmierung. :) – Almo

Antwort

23

ist leicht es deutlicher machen umschreiben lassen:

(*p1++) += 2 

wird also der alte Wert von p1 wird dereferenziert und 2 wird auf seinen referenten hinzugefügt werden. Und p1 wird inkrementiert, nachdem es dereferenziert wurde (oder zumindest, nachdem sein alter Wert geladen wurde und darauf wartet, dereferenziert zu werden). Das ist kein Problem: Keines der Stücke wird mehr als einmal benutzt.

Davon abgesehen, sollten Sie den Code zur Klarheit betrachten Umschreiben:

*p1 += 2; 
++p1; 
+9

"dann" ist nicht ganz richtig, der Nebeneffekt von + = könnte vor oder nach dem Nebeneffekt von ++ passieren. Der Schlüssel ist, dass sie sich auf verschiedenen skalaren Objekten befinden. – Cubbi

3

Postfix Inkrementoperator (++) ergibt den Wert des Operanden, das heißt, es gibt einen r-Wert. Der r-Wert bedeutet, dass er links vom Zuweisungsoperator (=) als Operand verwendet wird.

int i = 0; 
i++ = 0 // [Error] lvalue required as left operand of assignment 

Bei

*p1++ += 2; 

Postfix ++ auf *p1 nicht angewendet, aber es angewendet wird, um p1++-Zeiger. Dies liegt daran, dass Postfix ++ eine höhere Priorität hat als der des Dereferenzierungsoperators *. Also, Compiler wird die obige Aussage als

*(p1++) += 2; 

analysieren und diese sagt, dass:

  • *p1 ausgewertet werden müssen (um eine Variable zu erzeugen) vor dem Hinzufügen 2 und Zuweisung des Ergebnisses zu.
  • Das Ergebnis, das in *p1 gespeichert werden soll, muss vor dem Inkrement auf p1 ausgewertet werden.
  • Sobald *p1 ausgewertet wird, kann p1 jederzeit erhöht werden.
+0

Ist die letzte Anweisung in C++ garantiert? – BlueTrin

+0

@ BlueTrin; Ja. – haccks

+1

Ich hätte gedacht, dass, sobald 'p1' ausgewertet wird, 'p1' jederzeit erhöht werden kann. – BlueTrin