Was ist der Unterschied zwischen Präfix- und Postfix-Operatoren?
Lesezeit: 5 Minuten
pradeep
Der folgende Code gibt den Wert 9 aus. Warum? Hier return(i++) gibt einen Wert von 11 und fällig zurück --i der Wert sollte 10 selbst sein, kann jemand erklären, wie das funktioniert?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--i);
}
int fun (int i)
{
return(i++);
}
return i++ wird zurückkommen 10. return ++i würde 11 zurückgeben.
– Nemo
11. August 2011 um 19:00 Uhr
Denn was wirklich passiert, sind erstens zwei Dinge i wird zurückgegeben und dann i wird erhöht. Wenn du schreibst ++i dann passieren diese beiden Dinge in umgekehrter Reihenfolge.
– sketchyTech
3. Juli 2014 um 13:21 Uhr
Durch die Rückkehr i++ ein Ausdruck wird erstellt int i = i++;. Lassen Sie uns dies umschreiben als int j = i++; so ist es einfacher zu erklären. Dies ist die Post-Fix-Version von iwas Erhöhung bedeutet i nach Einstellung j = i. Da dies primitive ganze Zahlen sind, i tief kopiert wird j (es ist keine flache Kopie mit einer Zeigerreferenz) und daher j = 10. Dann i wird erhöht, also i = i + 1und deshalb i = 11. Die Präfixversion wird erhöht i bevor es kopiert wird jund daher haben beide Variablen denselben Wert (j = 11, i = 11).
– tim-montague
17. Februar 2017 um 1:39 Uhr
@tfmontague Diese Erklärung verdient es wirklich, eher in einer Antwort als in einem Kommentar enthalten zu sein.
– Ken Wayne VanderLinde
17. Februar 2017 um 2:31 Uhr
Fügen Sie hier einfach einen Kommentar hinzu, für Leute wie mich. Sie haben auch einen weiteren Unterschied: geeksforgeeks.org/g-fact-59 überprüfen Sie es auf den Unterschied in den Prioritäten.
– III_phr
22. November 2021 um 20:59 Uhr
Ken Wayne Vander Linde
Da ist ein groß Unterschied zwischen Postfix- und Präfixversionen von ++.
In der Präfixversion (d. h. ++i), der Wert von i wird inkrementiert, und der Wert des Ausdrucks ist der Neu Wert von i.
In der Postfix-Version (dh i++), der Wert von i wird inkrementiert, aber der Wert des Ausdrucks ist der Original Wert von i.
Lassen Sie uns den folgenden Code Zeile für Zeile analysieren:
int i = 10; // (1)
int j = ++i; // (2)
int k = i++; // (3)
i ist eingestellt auf 10 (einfach).
Zwei Dinge in dieser Zeile:
i wird inkrementiert 11.
Das Neu Wert von i hineinkopiert wird j. So j jetzt gleich 11.
Zwei Dinge auch in dieser Zeile:
i wird inkrementiert 12.
Das Original Wert von i (welches ist 11) kopiert wird k. So k jetzt gleich 11.
Nachdem Sie den Code ausgeführt haben, i wird 12 sein, aber beides j und k wird 11.
Dasselbe gilt für Postfix- und Präfixversionen von --.
@RenéG Außer das i wurde bereits auf erhöht 11 auf der vorherigen Zeile.
– Ken Wayne VanderLinde
13. Mai 2016 um 2:44 Uhr
Ich finde es bemerkenswert, dass die Leute immer noch versuchen, diese Antwort zu bearbeiten, vorausgesetzt, ich habe die Zahlen falsch verstanden. Alles, was man tun muss, ist diesen Code auszuführen und die Werte auszudrucken, um zu sehen, dass ich richtig liege.
– Ken Wayne VanderLinde
16. Dezember 2016 um 5:06 Uhr
Die Zahlen sind korrekt, aber der Code ist nicht sehr gut erklärt. Für einen Präfixausdruck int j = ++i;Die Variable i wird um eins erhöht (i = i + 1Also i = 11), und dann wird tief kopiert j (Also j = 11). Und dann für den Post-Fix-Ausdruck int k = i++;Die Variable i (was immer noch ist 11), wird zuerst tief kopiert k (Also k = 11), und dann i wird um eins erhöht (also i = 12).
– tim-montague
17. Februar 2017 um 2:07 Uhr
@tfmontague Lass es mich wissen, wenn du denkst, dass das besser ist.
– Ken Wayne VanderLinde
17. Februar 2017 um 2:29 Uhr
Ich möchte hinzufügen, dass die Wertkategorien von Ausdrücken unterschiedlich sind. i++ ist ein Prvalue-Ausdruck und ++i ist ein lvalue-Ausdruck.
– wallig
30. April 2019 um 14:26 Uhr
Dilu Thankachan
Präfix:
int a=0;
int b=++a; // b=1,a=1
vor der Zuweisung wird der Wert von erhöht.
Postfix:
int a=0;
int b=a++; // a=1,b=0
Weisen Sie zuerst den Wert von ‘a’ ‘b’ zu und erhöhen Sie dann den Wert von ‘a’
Die Funktion kehrt vorher zurück i wird erhöht, da Sie einen Postfix-Operator (++) verwenden. Jedenfalls die Erhöhung von i ist nicht global – nur für die jeweilige Funktion. Wenn Sie einen Präfixoperator verwendet hätten, wäre dies der Fall 11 und dann dekrementiert auf 10.
Sie kehren dann also zurück i als 10 und dekrementieren Sie es in der printf-Funktion, die angezeigt wird 9 nicht 10 wie Sie denken.
In der Tat return (i++) gibt nur 10 zurück.
Die Operatoren ++ und — können mit unterschiedlichen Auswirkungen vor oder nach der Variablen platziert werden. Wenn sie vorher sind, dann werden sie verarbeitet und zurückgegeben und im Wesentlichen wie (i-1) oder (i+1) behandelt, aber wenn Sie das ++ oder — nach dem i platzieren, dann ist die Rückgabe im Wesentlichen
return i;
i + 1;
Es wird also 10 zurückgegeben und niemals erhöht.
Es gibt zwei Beispiele, die den Unterschied veranschaulichen
int a , b , c = 0 ;
a = ++c ;
b = c++ ;
printf (" %d %d %d " , a , b , c++);
Hier hat c den Wert 0 c inkrementiere um 1 dann weise den Wert 1 einem so Wert von zu a = 1 und Wert von c = 1
nächste Anweisung weist Wert von zu c = 1 zu b dann c um 1 erhöhen, also Wert von b = 1 und Wert von c = 2
in printf Aussage, die wir haben c++ Dies bedeutet, dass der ursprüngliche Wert von c, der 2 ist, gedruckt wird und dann c um 1 erhöht wird printf Anweisung wird gedruckt 1 1 2 und der Wert von c ist jetzt 3
return i++
wird zurückkommen 10.return ++i
würde 11 zurückgeben.– Nemo
11. August 2011 um 19:00 Uhr
Denn was wirklich passiert, sind erstens zwei Dinge
i
wird zurückgegeben und danni
wird erhöht. Wenn du schreibst++i
dann passieren diese beiden Dinge in umgekehrter Reihenfolge.– sketchyTech
3. Juli 2014 um 13:21 Uhr
Durch die Rückkehr
i++
ein Ausdruck wird erstelltint i = i++;
. Lassen Sie uns dies umschreiben alsint j = i++;
so ist es einfacher zu erklären. Dies ist die Post-Fix-Version voni
was Erhöhung bedeuteti
nach Einstellungj = i
. Da dies primitive ganze Zahlen sind,i
tief kopiert wirdj
(es ist keine flache Kopie mit einer Zeigerreferenz) und daherj = 10
. Danni
wird erhöht, alsoi = i + 1
und deshalbi = 11
. Die Präfixversion wird erhöhti
bevor es kopiert wirdj
und daher haben beide Variablen denselben Wert (j = 11
,i = 11
).– tim-montague
17. Februar 2017 um 1:39 Uhr
@tfmontague Diese Erklärung verdient es wirklich, eher in einer Antwort als in einem Kommentar enthalten zu sein.
– Ken Wayne VanderLinde
17. Februar 2017 um 2:31 Uhr
Fügen Sie hier einfach einen Kommentar hinzu, für Leute wie mich. Sie haben auch einen weiteren Unterschied: geeksforgeeks.org/g-fact-59 überprüfen Sie es auf den Unterschied in den Prioritäten.
– III_phr
22. November 2021 um 20:59 Uhr