Warum ist der Rückgabewert der Fun-Funktion 8 statt 7? [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von Ashish Kumar
Asch Kumar

Unter Bezugnahme auf Kommagetrennte Rückgabeargumente in C-Funktion [duplicate]
,

x=x+2,x+1;

wird gewertet als

x=x+2; 

Allerdings im Falle des folgenden Codes

#include<stdlib.h>
#include<stdio.h>

int fun(int x)
{
    return (x=x+2,x+1); //[A]
}

int main()
{
   int x=5;
   x=fun(x);
   printf("%d",x); // Output is 8
}

Sollte nicht linieren [A]bewertet werden als

x=x+2;

geben x = 7

  • Der Befehlsfluss geht in diesem Fall von links nach rechts, Sie können es auch versuchen while(x=2,x<3) um dies zu überprüfen – es wird eine Endlosschleife sein.

    – Gaurav

    14. September 2019 um 20:40 Uhr

  • Vielen Dank, dass Sie aufgezeigt haben, warum wir versuchen, den Kommaoperator zu vermeiden.

    – Nik

    15. September 2019 um 19:58 Uhr

  • @Observer: Nun, ich denke, wir können den Test in die Mitte von ein paar Schleifenformen mehr setzen als ich.

    – Josua

    16. September 2019 um 2:30 Uhr

Die Aussage return (x = x + 2, x + 1); ist äquivalent zu:

x = x + 2; // x == 7
return x + 1; // returns 8

  • +1. Und um die Verwirrung des OP direkt anzusprechen: die Aussage x = x + 2, x + 1; ist äquivalent zu dem Anweisungspaar x = x + 2; x + 1;. Es ist nur die Aussage x + 1; eigentlich nicht tun irgendetwas, also können wir diese Aussage einfach ignorieren und sagen, dass sie äquivalent ist zu x = x + 2;. Beim Hinzufügen von a returnoffensichtlich die Aussage return x + 1; ist kein No-Op mehr, also können wir es nicht mehr ignorieren. 🙂

    – ruach

    15. September 2019 um 22:40 Uhr

Beim Schreiben return (x=x+2,x+1)der erste Ausdruck wird also zuerst ausgewertet x=x+2 ausgewertet, wodurch x als Nebeneffekt gleich 7 wird. Dann wird der zweite Ausdruck ausgewertet und zurückgegeben, daher gibt die Funktion x+1 zurück, also 8.

Wenn du geschrieben hättest return (x+2,x+1);wäre das Ergebnis 6 gewesen, weil der erste Ausdruck x+2 hat keine nebenwirkung.

  • warum return (x=x+2,x+1) verursacht eine Nebenwirkung?

    – Ashish Kumar

    14. September 2019 um 20:46 Uhr

  • @AshishKumar, weil es den Wert von ändert x. Nicht wirklich ein “Nebeneffekt”, weil es immer noch explizit ist, aber es verursacht x auf der rechten Seite des Kommas anders sein.

    – Matthias

    14. September 2019 um 20:58 Uhr


  • @AshishKumar Der Kommaoperator hat explizit einen Sequenzpunkt zwischen der Auswertung des linken und rechten Operanden. Das ist Ihnen garantiert x=x+2 wird vorher ausgewertet x+1. Unabhängig davon, schreiben Sie keinen beschissenen Code wie diesen und vermeiden Sie es , Betreiber im Allgemeinen.

    – Ludin

    16. September 2019 um 11:39 Uhr


Benutzeravatar von XBlueCode
XBlueCode

Beide Teile im return jeweils ausgewertet und das Ergebnis der letzten Anweisung zurückgegeben:

Zunächst haben wir:

x = x + 2 // 7

Jetzt x wird aktualisiert 7 vor der zweiten Auswertung, die ergibt:

x + 1 // 7 + 1 = 8

und kehre endlich zurück 8.

Betrachten Sie zum besseren Verständnis den Fall der Zwischenvariablen wie folgt:

return (y = x + 2, y + 1);

  • ist dies ein Nebeneffekt von return, da dies nicht das Standardverhalten für den Kommaoperator ist?

    – Ashish Kumar

    14. September 2019 um 20:48 Uhr

  • Wenn Sie den ersten Ausdruck nicht zugewiesen haben x dann wird nur der letzte Ausdruck als Rückgabewert berücksichtigt

    – XBlueCode

    14. September 2019 um 20:52 Uhr

  • Probieren Sie es mit zwei Variablen aus, es könnte Ihnen eine bessere Vorstellung wie folgt geben: return (y = x + 2, y + 1)

    – XBlueCode

    14. September 2019 um 20:55 Uhr

  • Jetzt macht es Sinn.

    – Ashish Kumar

    14. September 2019 um 21:02 Uhr

  • Nitpick: Es ist der Kommaoperator, der beide Teile auswertet und letzteren zurückgibt. Es ist nicht spezifisch für die return Anweisung, würden Sie den gleichen Effekt mit erhalten y=(x=x+2, x+1)

    – Ilkkachu

    15. September 2019 um 15:25 Uhr

Benutzeravatar von lucidbrot
klarbrot

Die QA, die Sie bequem verknüpft haben, gibt an

Der Kommaoperator wertet eine Reihe von Ausdrücken aus. Der Wert der Kommagruppe ist der Wert des letzten Elements in der Liste.

also der Wert von

x+2,x+1;

ist x+1 und es gibt keine nebenwirkungen.


Beispielcode:

#include<stdio.h>
int main(int argc, char * argv){
    int x;
    x = 0;
    x = (x+2, x+1);
    printf("%d\n", x);
    return 0;
}

ergibt sich 1 wenn laufen.


Allerdings, wenn Sie es tun

return (x=x+2, x+1)

Sie haben eine Nebenwirkung: x wird dann zuerst um zwei erhöht x um 1 erhöht und das Ergebnis zurückgegeben.

Das ist eine Frage der Operatorpriorität.

x=x+2,x+1 wird bewertet als (x=x+2), (x+1) und nicht als x=(x+2,x+1)

Benutzeravatar von SS Anne
SS Anne

Wie andere Benutzer sagten, geht der Befehlsfluss von links nach rechts und im Fall von return, gibt es den Wert im Operator ganz rechts zurück. Was vor diesem Operator geschrieben und durch Kommas getrennt wird, unterscheidet sich nicht von zeilengeschriebenen Ausdrücken. Beispiel:

return (x = x + 2, x = x - 5, x + 1);

Der folgende Code erzeugt das gleiche Ergebnis:

x = x + 2;  
x = x - 5;
return x + 1;

Zum x = 0das würde zurückkehren -2. Beachten Sie, dass für beide Codes, wenn wir uns ändern x = x - 5 zu x - 5dh wir subtrahieren 5 aus x aber das Ergebnis nirgendwo speichern, der Rückgabewert von x wird sich ändern zu 3 und damit die Gleichwertigkeit bestätigen.

Benutzeravatar von SS Anne
SS Anne

Der Kommaoperator fügt einen Sequenzpunkt in Ihren Code ein. Die Anweisungen werden in dieser Reihenfolge ausgewertet:

  1. x = x + 2an welcher Stelle das Lokal x in fun ist 7.

  2. x + 1die 8 ergibt und zurückgegeben wird.

Zur Verdeutlichung ist hier eine Version in Klammern, die den Vorrang der Operatoren zeigt:

return (x=x+2),x+1;

Der linke Ausdruck wird ausgewertet und sein Wert verworfen. Der Wert des rechten Ausdrucks wird zurückgegeben.

1388200cookie-checkWarum ist der Rückgabewert der Fun-Funktion 8 statt 7? [duplicate]

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

Privacy policy