Kommaoperator in c [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von Kr Arjun
Kr Arjun

#include<stdio.h> 
int main(void) {
   int a;
   a = (1, 2), 3; 
   printf("%d", a);
   return 0;
}

Ausgang: 2

Kann jemand erklären, wie Ausgabe 2 ist?

  • Können Sie erklären, was Ihre Erwartung war, als Sie den Code geschrieben haben? Es ist nicht so, dass Anweisungen und Ausdrücke zusammengefügt werden, der Code sollte aussagekräftig sein. Was versuchen Sie zu erreichen?

    – Sourav Ghosh

    12. September 2017 um 13:21 Uhr

  • @Olaf Um die Frage zu beantworten, muss man nicht wissen, was das OP erwartet. Erklären Sie einfach die Mechanismen, die zu dem Ergebnis “2” führen (wenn Sie sich die Mühe machen und es beantworten möchten)

    – Ctx

    12. September 2017 um 13:30 Uhr

  • @Olaf Die Frage bezieht sich eindeutig nicht auf das Debuggen, ist aber themenbezogen

    – Ctx

    12. September 2017 um 13:39 Uhr

  • @Olaf Das OP ist neugierig, warum sich C so verhält. Der Operatorvorrang ist hier ein Haken, und ich glaube nicht, dass dieser spezielle Fall in den meisten guten C-Büchern beschrieben wird. Dies ist weder Debugging noch “zu breit”, sondern versucht zu verstehen, wie dieses (nicht triviale) Konstrukt funktioniert. Ich stimme nicht zu, dass dies eine Löffelfütterungsfrage ist.

    – Ctx

    12. September 2017 um 13:45 Uhr

  • @Olaf Ich bin anderer Meinung. Selbst wenn Sie ein Ergebnis erwarten, können Sie sich fragen, „wie“ oder „warum“. Ich habe diesen Fall noch nie gesehen und fand ihn interessant. Stimme Ctx hier zu.

    – Hans Petter Taugbøl Kragset

    12. September 2017 um 13:46 Uhr

Benutzeravatar von JFMR
JFMR

Kann jemand erklären, wie Ausgabe 2 ist?

Denn der Vorrang der Aufgabenverwalter (=) ist höher als die Komma-Operator (,).

Daher die Aussage:

a = (1, 2), 3;

ist äquivalent zu:

(a = (1, 2)), 3;

und der Ausdruck (1, 2) wertet zu 2.

  • @Olaf Oh ja, es beantwortet die Frage: Das bedeutet es a wird der Wert des Ausdrucks zugewiesen (1, 2)welches ist 2. Das , 3 ist für die Aufgabenstellung irrelevant.

    – Cmaster – Wiedereinsetzung von Monica

    12. September 2017 um 13:23 Uhr

  • @cmaster: Ich sehe keinen Hinweis darauf, dass OP davon ausgeht 3. Das konnte er auch erwarten 1. Was einen anderen Grund hat.

    – zu ehrlich für diese Seite

    12. September 2017 um 13:24 Uhr


  • Nun, manchmal sollte die Antwort die richtige Balance zwischen Führung und Löffelfütterung finden …

    – Eugen Sch.

    12. September 2017 um 13:25 Uhr

  • @Gam Lesen Sie den Ausdruck erneut (a = (1, 2)), 3: Der Teilausdruck, der die Zuweisung durchführt, enthält nicht einmal ein a 3. Klärt das die Sache auf?

    – Cmaster – Wiedereinsetzung von Monica

    12. September 2017 um 13:27 Uhr

  • @cmaster Oh ja, tut mir leid, ich verstehe es jetzt! Die Variable nimmt den Wert 2 an (die 1 ist hier nutzlos), dann wird der Ausdruck “3” ausgewertet, aber es spielt keine Rolle, es tut nichts

    – Spiel

    12. September 2017 um 13:31 Uhr

Benutzeravatar von hackks
hackt

Kann jemand erklären, wie Ausgabe 2 ist?

In der Aussage

a = (1, 2), 3;   

, gebraucht ist ein Komma-Operator. Aufgrund der höheren Operatorpriorität von = Betreiber als die von , Operator, der Ausdrucksoperand (1, 2) wird sich binden = wie

(a = (1, 2)), 3;  

Im Falle eines Komma-Operators, der linke Operand eines Komma-Operators wird zu einem void-Ausdruck ausgewertet, dann wird der rechte Operand ausgewertet und das Ergebnis hat den Wert und Typ des rechten Operanden.

Hier gibt es zwei Kommaoperatoren. Für den ersten Kommaoperator im Ausdruck (1, 2), 1 wird dann zu ungültigem Ausdruck und dann ausgewertet 2 ausgewertet und zugeordnet werden a.
Nun Nebenwirkung dazu a stattgefunden hat und daher der rechte Operand des zweiten Kommaoperators ist 3 ausgewertet und der Wert des Ausdrucks (a = (1, 2)), 3 wird sein 3.

Benutzeravatar von Rui Silva
Rui Silva

das Ergebnis von:

a = x, y     =>     x

a = (i, j)   =>     j

also, wenn wir haben:

x = (1 , 2)

a = (1 , 2) , 3     =>     2

Wie gesagt hier:

Der Komma-Operator trennt Ausdrücke (die einen Wert haben) analog dazu, wie das Semikolon Anweisungen beendet, und Sequenzen von Ausdrücken werden in Klammern eingeschlossen, analog dazu, wie Sequenzen von Anweisungen in geschweifte Klammern eingeschlossen werden: (a, b, c) ist eine Sequenz von Ausdrücken, getrennt durch Kommas, was zum letzten Ausdruck c ausgewertet wird, während {a; b; c;} ist eine Folge von Anweisungen und ergibt keinen Wert. Ein Komma kann nur zwischen zwei Ausdrücken stehen – Kommas trennen Ausdrücke – im Gegensatz zum Semikolon, das am Ende einer (Nicht-Block-)Anweisung steht – beenden Semikolons Anweisungen.

Der Kommaoperator hat den niedrigsten Vorrang aller C-Operatoren und fungiert als Sequenzpunkt. In einer Kombination aus Kommas und Semikolons haben Semikolons einen geringeren Vorrang als Kommas, da Semikolons Anweisungen trennen, Kommas jedoch innerhalb von Anweisungen vorkommen, was ihrer Verwendung als gewöhnliche Interpunktion entspricht: a, b; c, d ist gruppiert als (a, b); (c, d), weil dies zwei getrennte Aussagen sind.

Ich hoffe, das beantwortet Ihre Frage.

1393810cookie-checkKommaoperator in c [duplicate]

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

Privacy policy