Post-Increment- und Pre-Increment-Konzept?

Lesezeit: 4 Minuten

Post Increment und Pre Increment Konzept
Saad Masood

Ich verstehe das Konzept von Postfix- und Präfix-Inkrement oder -Dekrement nicht. Kann jemand eine bessere Erklärung geben?

  • Mögliches Duplikat von Was ist der Unterschied zwischen ++i und i++

    – TylerH

    27. Juli 2016 um 21:56 Uhr

  • oder vielleicht Inkrementieren in C++ – Wann sollte man x++ oder ++x verwenden? (oder höchstwahrscheinlich 10s von anderen)

    – Unterstrich_d

    29. September 2018 um 22:52 Uhr

  • Wenn Sie Hindi verstehen :), erklärt dies sehr deutlich youtube.com/watch?v=yRt-zYFJIvE

    – Deepak

    15. Juni 2020 um 19:31 Uhr

Post Increment und Pre Increment Konzept
Prost und hth. – Alf

Alle vier Antworten sind bisher falschindem sie eine bestimmte Reihenfolge der Ereignisse behaupten.

Der Glaube, dass “urban legend” viele Anfänger (und Profis) in die Irre geführt hat, nämlich der endlose Strom von Fragen zu undefiniertem Verhalten in Ausdrücken.

Damit.

Für den integrierten C++-Präfixoperator

++x

Schritte x und erzeugt (als Ergebnis des Ausdrucks) x als lvalue, während

x++

Schritte x und erzeugt (als Ergebnis des Ausdrucks) den ursprünglichen Wert von x.

Insbesondere z x++ es gibt kein keine Zeit zum Bestellen impliziert für die Erhöhung und Produktion des ursprünglichen Werts von x. Dem Compiler steht es frei, Maschinencode auszugeben, der den ursprünglichen Wert von erzeugt xzB könnte es in irgendeinem Register vorhanden sein, und das verzögert das Inkrement bis zum Ende des Ausdrucks (nächster Sequenzpunkt).

Leute, die fälschlicherweise glauben, dass das Inkrement zuerst kommen muss, und es gibt viele, schließen oft daraus, dass bestimmte Ausdrücke eine genau definierte Wirkung haben müssen, wenn sie tatsächlich ein undefiniertes Verhalten haben.

  • @Sa’me Smd: “lvalue” ist im Wesentlichen ein Verweis auf ein Objekt mit Speicher. Diese Terminologie stammt aus dem frühen C, wo eine Zuweisung einen lvalue auf dem benötigte links Seite.

    – Prost und hth. – Alf

    15. Dezember 2010 um 1:35 Uhr

  • Sie haben Recht mit der Mechanik, aber ich denke, Sie liegen falsch, wenn Sie andere sagen, und auf der konzeptionellen Ebene falsch. Die Mechanismen sind nur praktische Aspekte des Versuchs, das Konzept umzusetzen. ‘Post’ bedeutet after – konzeptionell ist das Inkrement fertig danach. Das gesamte Konzept von „Sequenz“ wie in „Sequenzpunkt“ impliziert eine Reihenfolge, und das UB kommt von einem Missverständnis, wie Sequenzpunkte funktionieren, nicht von einem „Missverständnis“ der Bedeutung von „vor“ und „nach“.

    – sje397

    15. Dezember 2010 um 1:48 Uhr

  • Wie würde also ein Ausdruck aussehen? (i++ > 0) && someProperty(myArray[i]) tun? Wenn i=5 wäre, würde es anrufen someProperty mit myArray[5] oder myArray[6]?

    – AJMansfield

    12. November 2012 um 1:39 Uhr


  • @AJMansfield: In C++03-Begriffen ist die eingebaute && führt einen Sequenzpunkt ein (C++03 §1.9/18). In C++11-Begriffen ist der linke Operand Ausdruck des eingebauten && wird vor dem rechten Operandenausdruck sequenziert (C++11 §5.14/2). Das heißt, wenn der Anruf getätigt wird, wird er mit getätigt i Wert 6.

    – Prost und hth. – Alf

    12. November 2012 um 4:09 Uhr


  • @AJMansfield: Die && und || sind einzigartig bei der Bereitstellung von Kurzschlussauswertungen (und damit Sequenzpunkten). Der ternäre Wahloperator ist ein bisschen so, indem er garantiert, dass die nicht getroffene Wahl nicht ausgewertet wird. Bei arithmetischen Operatoren erhalten Sie jedoch nur undefiniertes Verhalten, wenn Sie eine Variable sowohl ändern als auch in demselben Ausdruck verwenden. Ich denke, bin mir aber nicht sicher, ob das auch bei allen anderen Betreibern so ist. Es ist sowieso die beste Annahme, und es ist nicht gut, Code zu schreiben, der sich auf einen subtilen Sonderfall stützt, von dem nur wenige Programmierer wissen, wenn überhaupt. 😉

    – Prost und hth. – Alf

    13. November 2012 um 0:09 Uhr

int i, x;

i = 2;
x = ++i;
// now i = 3, x = 3

i = 2;
x = i++; 
// now i = 3, x = 2

‘Post’ bedeutet nach – das heißt, die Erhöhung erfolgt, nachdem die Variable gelesen wurde. ‘Pre’ bedeutet vorher – also wird der Variablenwert zuerst erhöht und dann im Ausdruck verwendet.

  • “Die Erhöhung erfolgt, nachdem die Variable gelesen wurde”. Früher dachte ich, ich verstehe Post- und Präfix-Inkremente, aber jetzt haben Sie es verstanden mich verwirrt!

    – wilhelmtel

    15. Dezember 2010 um 0:52 Uhr

  • Warum ist das verwirrend? Wir sprechen über die Konzept von ‘pre’ und ‘post’ Inkrement. Diese Präfixe bedeuten Vor und nach dem.

    – sje397

    15. Dezember 2010 um 1:48 Uhr

  • Das „pre“ und „post“ in „preincrement“ und „postincrement“ beziehen sich auf die Position des Operators in Bezug auf den Operanden. Sie implizieren keine zeitliche Reihenfolge zwischen dem Auftreten des Inkrements und dem Lesen der Variablen.

    – James McNellis

    20. Dezember 2010 um 15:16 Uhr

  • @James: Ich verstehe Ihren Standpunkt – aber stellen Sie sich zur Veranschaulichung vor, wie verwirrend es wäre, wenn die Funktion der Operatoren umgekehrt wäre. Ich weiß, dass es technisch gesehen keine Implikation einer zeitlichen Ordnung gibt, aber es gibt definitiv eine konzeptionelle Zuordnung des Post-Inkrements zur Idee des „Inkrementierens“. nach dem verwenden’.

    – sje397

    20. Dezember 2010 um 23:47 Uhr

  • @sje397 warum zum Beispiel int a = 5; cout << a++; druckt nur 5 statt 6 nach Ihrem Beispiel?

    – RaHuL

    11. Februar 2020 um 13:17 Uhr

Der Unterschied zwischen der postfix Zuwachs, x++und das Präfix Zuwachs, ++xist genau in wie die beiden Operatoren werten ihre Operanden aus. Das Postfix-Inkrement kopiert konzeptionell den Operanden in den Speicher, inkrementiert den ursprünglichen Operanden und liefert schließlich den Wert der Kopie. Ich denke, dies lässt sich am besten durch die Implementierung des Operators im Code veranschaulichen:

int operator ++ (int& n)  // postfix increment
{
    int tmp = n;
    n = n + 1;
    return tmp;
}

Der obige Code wird nicht kompiliert, da Sie Operatoren für primitive Typen nicht neu definieren können. Der Compiler kann hier auch nicht erkennen, dass wir a definieren postfix Betreiber statt Präfix, aber nehmen wir an, dies sei korrekt und gültiges C++. Sie sehen, dass der Postfix-Operator zwar auf seinen Operanden einwirkt, aber den alten Wert vor dem Inkrement zurückgibt, also das Ergebnis des Ausdrucks x++ ist der Wert vor dem Inkrement. xaber, ist erhöht.

Das Präfix-Inkrement inkrementiert auch seinen Operanden, liefert aber den Wert des Operanden nach dem die Erhöhung:

int& operator ++ (int& n)
{
    n = n + 1;
    return n;
}

Das bedeutet, dass der Ausdruck ++x bewertet den Wert von x nach dem das Inkrement.

Es ist leicht zu denken, dass der Ausdruck ++x ist also gleichbedeutend mit dem Assignmnet (x=x+1). Dies ist jedoch nicht genau so, weil ein Zuwachs ist eine Operation, die in verschiedenen Kontexten unterschiedliche Bedeutungen haben kann. Im Fall einer einfachen primitiven ganzen Zahl, in der Tat ++x ist ersetzbar für (x=x+1). Aber im Fall eines Klassentyps, wie z. B. eines Iterators einer verketteten Liste, bedeutet ein Präfixinkrement des Iterators definitiv nicht, “dem Objekt eins hinzuzufügen”.

Post Increment und Pre Increment Konzept
mathewbruens

Niemand hat die Frage beantwortet:
Warum ist dieses Konzept verwirrend?

Als Informatik-Student brauchte ich eine Weile, um das zu verstehen so wie ich lese der Code.

Folgendes ist nicht richtig!


x = y++

X ist gleich y Post Zuwachs. Was logischerweise bedeuten würde, dass X gleich dem Wert von Y ist nach dem Die Inkrementoperation ist abgeschlossen. Post Bedeutung nach dem.

oder

x = ++y
X ist gleich y Vor-Zuwachs. Was logischerweise bedeuten würde, dass X gleich dem Wert von Y ist Vor Die Inkrementoperation ist abgeschlossen. Vor Bedeutung Vor.


Die Funktionsweise ist eigentlich das Gegenteil. Dieses Konzept ist verwirrend, weil die Sprache irreführend ist. In diesem Fall können wir die Worte nicht verwenden, um das Verhalten zu definieren.
x=++y wird tatsächlich gelesen, da X gleich dem Wert von Y ist nach dem das Inkrement.
x=y++ wird tatsächlich gelesen, da X gleich dem Wert von Y ist Vor das Inkrement.

Die Wörter vor und nach sind rückwärts in Bezug auf die Semantik des Englischen. Sie bedeuten nur, wo das ++ in Beziehung zu Y steht. Nichts weiter.

Wenn ich persönlich die Wahl hätte, würde ich die Bedeutungen von ++y und y++ vertauschen. Dies ist nur ein Beispiel für eine Redewendung, die ich lernen musste.

Ob dieser Wahnsinn eine Methode hat, würde ich gerne in einfachen Worten wissen.

Danke fürs Lesen.

Es ist ziemlich einfach. Beide erhöhen den Wert einer Variablen. Die folgenden zwei Zeilen sind gleich:

x++;
++x;

Der Unterschied besteht darin, ob Sie den Wert einer zu inkrementierenden Variablen verwenden:

x = y++;
x = ++y;

Hier erhöhen beide Zeilen den Wert von y um eins. Der erste weist jedoch x den Wert von y vor dem Inkrement zu, und der zweite weist x den Wert von y nach dem Inkrement zu.

Es gibt also nur einen Unterschied, wenn das Inkrement auch als Ausdruck verwendet wird. Das Post-Inkrement erhöht sich nach der Rückgabe des Werts. Das Vorinkrement erhöht vorher.

  • Die beiden Linien sind überhaupt nicht gleich. -1

    – wilhelmtel

    15. Dezember 2010 um 0:51 Uhr

  • wilhemtell: Danke, dass du absolut nichts zur Diskussion beigetragen hast. Gut gemacht.

    – Jonathan Holz

    15. Dezember 2010 um 0:55 Uhr

  • @JonathanWood was ist die Art von x? Hier hast du es. Die beiden Linien sind nicht gleich. Soll ich der Diskussion jetzt noch etwas hinzufügen?

    – wilhelmtel

    15. Dezember 2010 um 1:22 Uhr

  • @JamesMcNellis Neinhaben die ersten beiden Anweisungen die gleiche Wirkung, es sei denn x ist ein Klassentyp Zeitraum.

    – wilhelmtel

    15. Dezember 2010 um 1:35 Uhr

  • @wilhelmtell: Wenn die Überladungen konsistent sind (was sie sein sollten), dann die Wirkung der Aussagen x++; und ++x; ist dasselbe. Ja, Sie rufen verschiedene Funktionen auf, aber sie sollten dasselbe tun. Darauf wollte ich hinaus.

    – James McNellis

    15. Dezember 2010 um 1:47 Uhr

1647187222 714 Post Increment und Pre Increment Konzept
Seth

int i = 1;
int j = 1;

int k = i++; // post increment
int l = ++j; // pre increment

std::cout << k; // prints 1
std::cout << l; // prints 2

Postinkrement impliziert den Wert i wird inkrementiert, nachdem es zugewiesen wurde k. Pre-Increment impliziert jedoch, dass der Wert j inkrementiert wird, bevor er ihm zugewiesen wird l.

Gleiches gilt für das Dekrement.

  • Die beiden Linien sind überhaupt nicht gleich. -1

    – wilhelmtel

    15. Dezember 2010 um 0:51 Uhr

  • wilhemtell: Danke, dass du absolut nichts zur Diskussion beigetragen hast. Gut gemacht.

    – Jonathan Holz

    15. Dezember 2010 um 0:55 Uhr

  • @JonathanWood was ist die Art von x? Hier hast du es. Die beiden Linien sind nicht gleich. Soll ich der Diskussion jetzt noch etwas hinzufügen?

    – wilhelmtel

    15. Dezember 2010 um 1:22 Uhr

  • @JamesMcNellis Neinhaben die ersten beiden Anweisungen die gleiche Wirkung, es sei denn x ist ein Klassentyp Zeitraum.

    – wilhelmtel

    15. Dezember 2010 um 1:35 Uhr

  • @wilhelmtell: Wenn die Überladungen konsistent sind (was sie sein sollten), dann die Wirkung der Aussagen x++; und ++x; ist dasselbe. Ja, Sie rufen verschiedene Funktionen auf, aber sie sollten dasselbe tun. Darauf wollte ich hinaus.

    – James McNellis

    15. Dezember 2010 um 1:47 Uhr

1647187223 621 Post Increment und Pre Increment Konzept
Suri

Post-Inkrement:

int x, y, z;

x = 1;
y = x++; //this means: y is assigned the x value first, then increase the value of x by 1. Thus y is 1;
z = x; //the value of x in this line and the rest is 2 because it was increased by 1 in the above line. Thus z is 2.

Vorinkrement:

int x, y, z;

x = 1;
y = ++x; //this means: increase the value of x by 1 first, then assign the value of x to y. The value of x in this line and the rest is 2. Thus y is 2.
z = x; //the value of x in this line is 2 as stated above. Thus z is 2.

998320cookie-checkPost-Increment- und Pre-Increment-Konzept?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy