Was ist der Unterschied zwischen Präfix- und Postfix-Operatoren?

Lesezeit: 5 Minuten

Benutzeravatar von pradeep
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

Benutzeravatar von Ken Wayne VanderLinde
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)
  1. i ist eingestellt auf 10 (einfach).
  2. Zwei Dinge in dieser Zeile:
    • i wird inkrementiert 11.
    • Das Neu Wert von i hineinkopiert wird j. So j jetzt gleich 11.
  3. 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

Benutzeravatar von Dilu Thankachan
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

Sie können verwenden http://pythontutor.com/c.html

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , ++c);
  • Hier rein printf Aussage ++c wird den Wert von c zuerst um 1 erhöhen und dann c so den neuen Wert 3 zuweisen printf Anweisung wird gedruckt 1 1 3

Benutzeravatar von Rafe Kettler
Rafe Kettler

Das Postfix-Inkrement ++ erhöht den Wert seines Operanden erst, nachdem er ausgewertet wurde. Der Wert von i++ ist i.

Das Präfix-Dekrement erhöht den Wert seines Operanden Vor es wurde ausgewertet. Der Wert von --i ist i - 1.

Prefix Increment/Decrement ändert den Wert, bevor der Ausdruck ausgewertet wird. Postfix Inkrement/Dekrement ändert den Wert danach.

Also in deinem Fall fun(10) gibt 10 zurück und wird gedruckt --i Drucke i - 1das ist 9.

Benutzeravatar von Alok Save
Alok Speichern

i++ ist Postinkrement. Die Erhöhung erfolgt nach Rückgabe des Wertes.

1411010cookie-checkWas ist der Unterschied zwischen Präfix- und Postfix-Operatoren?

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

Privacy policy