Warum ändert das Setzen von Klammern um eine Liste von kommagetrennten Werten die Zuweisung? [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
Pranit Kothari

Bitte beachten Sie folgenden Code,

    int i;

    i = 1,2,3,4,5;
    printf("First time i = %d\n",i);

    i = (1,2,3,4,5);
    printf("Second time i = %d\n",i);   

Ausgabe:

Beim ersten Mal ist i = 1

Beim zweiten Mal i = 5


Warum nehmen die Klammern den Kommaoperator den letzten Wert und ohne Klammern den ersten Wert?

Danke im Voraus.

  • Dies kann helfen. Prüfen Examples Überschrift auf dieser Seite.

    – Tagesrai

    15. Juli 2013 um 7:18 Uhr


  • @Dayalrai, das ist keine Hilfe

    – ar2015

    26. September 2015 um 0:16 Uhr

  • @ ar2015 Ich kann klar sehen, dass die Antwort darin liegt Beispiele Abschnitt aus dem bereitgestellten Link, wo i = (a,b) und i = a,b wird diskutiert.

    – Tagesrai

    3. Oktober 2015 um 7:51 Uhr

Das erste ist äquivalent zu (i = 1),2,3,4,5; was bedeutet, dass die Kommas keine Wirkung haben. Bei Verwendung mit Klammern wird der letzte Wert in der “kommagetrennten Liste” zurückgegeben.

Dies alles ist auf die Operatorpriorität zurückzuführen, über die Sie eine Tabelle anzeigen können hier

  • Einverstanden, aber warum letzter Wert?

    – Pranit Kothari

    15. Juli 2013 um 7:15 Uhr

  • @pranitkothari Weil das Komma die niedrigste Operatorpriorität hat und Klammern sie zusammen gruppieren. Der Kommaoperator hat eine Assoziativität von links nach rechts.

    – Raptz

    15. Juli 2013 um 7:17 Uhr

Benutzer-Avatar
Filip Roséen – Refp

Dies liegt an der Operator Vorrang und die Reihenfolge der Auswertung. = bindet härter als , und daraus können wir herausfinden, dass die beiden folgenden Ausdrücke gleich sind:

i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)

Nebenbemerkung: die Komma-Operator ist der “schwächste” Operator von allen


Warum tut die Komma-Operator den letzten Wert unserer Liste liefern?

Um es einfach auszudrücken, wertet dieser Operator den ersten Operanden aus, nur um ihn zu verwerfen und zum nächsten überzugehen, er bindet links nach rechts was bedeutet, dass es von links beginnt und nach rechts weitergeht.


Wo kann ich mehr zu diesem Thema lesen?

  • +1 für die Erwähnung der Operatorpriorität

    – Junix

    15. Juli 2013 um 7:15 Uhr

  • +1 Schöne Erklärung, aber wirklich leid, Anthere als Antwort gewählt.

    – Pranit Kothari

    15. Juli 2013 um 7:27 Uhr

Benutzer-Avatar
AllTooSir

Die Zuweisung hat eine höhere Priorität als das Komma , daher das Ergebnis, das Sie im ersten Fall erhalten. Sie können das gesamte finden Operator-Prioritätstabelle hier .

Warum macht Klammern den Kommaoperator dazu, den letzten Wert zu nehmen, und ohne Klammern nimmt er den ersten Wert?

Weil Klammern verwendet werden, um die Priorität zu überschreiben. Der erste Fall ist implizit äquivalent zu:

(i = 1),2,3,4,5;

Komma wird von links nach rechts ausgewertet und der Wert ganz rechts ist der Wert des gesamten Ausdrucks. Lies das Dokumentation hier.

Der Kommaoperator hat eine Assoziativität von links nach rechts. Zwei durch ein Komma getrennte Ausdrücke werden von links nach rechts ausgewertet. Der linke Operand wird immer ausgewertet, und alle Seiteneffekte werden abgeschlossen, bevor der rechte Operand ausgewertet wird.

Benutzer-Avatar
Markus García

Da = hat eine höhere Priorität als , (die die niedrigste hat), die erste ist die gleiche wie

(i = 1),2,3,4,5;

die zuweist 1 zu i (i = 1) und wertet dann die Ausdrücke aus 2, 3, 4und 5 durch die Kommaoperatoren (der gesamte Ausdruck ergibt tatsächlich 5, die nicht verwendet wird). Im zweiten,

(1,2,3,4,5)

ist in Klammern gesetzt, wird also vorher ausgewertet =. Es fuehrt zu 5 (der ganz rechte Ausdruck; dies ist das Verhalten des Komma-Operators), dem dann zugewiesen wird i.

i = (1,2,3,4,5);
    |         |
    \---------\--- results in 5 then is assigned to i

Sehen Operatorvorrang Wikipedia-Artikel.

1179150cookie-checkWarum ändert das Setzen von Klammern um eine Liste von kommagetrennten Werten die Zuweisung? [duplicate]

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

Privacy policy