Mehrere Ganzzahlen, getrennt durch Komma, an ein int in C - Warum funktioniert das? Wozu? [Duplikat]

7

Ich sah das in einer Prüfung und als ich es ausprobierte war ich überrascht. Ich habe es online versucht und es funktioniert auch. Also ich denke, es ist die C-Sprache.

Warum funktioniert das? Was ist der Anwendungsfall für eine solche Zuordnungssyntax?

%Vor%     
Elyasin 30.07.2015, 01:09
quelle

5 Antworten

9

Dies sind nicht "mehrere ganze Zahlen", sondern ein Komma-Operator. Der gesamte eingeklammerte Teil ist ein einzelner Ausdruck mit jedem Unterausdruck (getrennt durch Kommas), der streng von links nach rechts ausgewertet wird. Die Ergebnisse aller außer dem rechten Unterausdruck werden ignoriert. Das Ergebnis des gesamten Ausdrucks ist das des letzten Ausdrucks (ganz rechts). Hier ist es der ganzzahlige Wert 5 .

Beachten Sie, dass dieser Operator hauptsächlich dort verwendet wird, wo nur ein einziger Ausdruck weitere Nebenwirkungen hinzufügen darf. Z.B. in einer Schleife wie:

%Vor%

Dies zählt die Anzahl der Zeichen in einer C-Zeichenfolge und erhöht den Zeiger und cnt nach jeder Iteration. Die Ergebnisse werden hier ignoriert.

Also, das ist in no Weise mit Tupeln oder ähnlich wie in Python verwandt. Es gibt tatsächlich keine Fälle, in denen die Verwendung dieses Operators unvermeidlich ist, und es sollte mit Vorsicht verwendet werden - und einige Codierungsstandards verbieten seine Verwendung.

    
Olaf 30.07.2015, 01:14
quelle
7

Das ist der Komma-Operator bei der Arbeit. Er wertet den Ausdruck auf der linken Seite aus, erstellt einen Sequenzpunkt, verwirft den Wert des Ausdrucks, wertet dann den Ausdruck auf der rechten Seite aus und gibt diesen als Wert zurück. Wenn wie im Beispiel mehrere Ausdrücke vorhanden sind, wird jeder der Reihe nach ausgewertet, und nur der letzte wird beibehalten. Mit dem Beispiel führt der Compiler die Auswertung durch, da jeder Wert zur Kompilierungszeit bekannt ist. Beachten Sie, dass die Argumentliste für eine Funktion keine Verwendung des Kommaoperators ist.

Das ist kein gültiger Anwendungsfall für den Komma-Operator. Ein eher naheliegender Anwendungsfall wären einige Operationen mit Nebeneffekten (z. B. Funktionsaufrufe), die sequenziert und dem endgültigen Wert zugewiesen werden müssen:

%Vor%

Dies setzt i auf das dritte Zeichen in der Standardeingabe oder EOF, wenn in der Standardeingabe nicht mehr drei Zeichen zum Lesen vorhanden sind. Immer noch kein realistischer Anwendungsfall, aber besser als eine Liste von Konstanten zu vergeben.

    
Jonathan Leffler 30.07.2015 01:12
quelle
3

Zusätzlich zu den anderen Antworten müssen Sie nach Instanzen suchen, in denen , der Kommaoperator ist, und nicht, wenn es sich um ein Trennzeichen handelt. Zum Beispiel ist das Folgende ungültig:

%Vor%

In diesem Fall ist , ein Trennzeichen zwischen Variablendeklarationen. Es deklariert i als int und initialisiert es auf 1, dann versucht es 2 als Variablennamen zu analysieren, was fehlschlägt.

    
dbush 30.07.2015 01:27
quelle
2

Es funktioniert, weil Sie den "Komma-Operator" verwenden, der die Teilausdrücke links und rechts auswertet und den Wert aus dem rechten Ausdruck hat.

Also in (1,2,3,4,5) , 1 wird ausgewertet und das Ergebnis wird verworfen, dann 2,3,4,5 ... in dem (wegen des nächsten Kommas) 2 ausgewertet und das Ergebnis verworfen wird, dann 3,4,5 ... in dem 3 ausgewertet und verworfen wird, dann 4,5 ... in dem 4 ausgewertet und verworfen wird, dann 5 , das das Ergebnis des Ausdrucks wird.

Wenn es nützlich ist, hauptsächlich als Abkürzung, wenn Sie mehrere (Teil-) Ausdrücke für ihre Nebenwirkungen auswerten müssen, aber nicht an ihren Werten interessiert sind (außer vielleicht am letzten). Manchmal ist es in for -Schleifenausdrücken nützlich, etwa wenn zwei Variablen inkrementiert werden:

%Vor%

.. wo es sowohl im Initialisierungsausdruck als auch im Schleifenausdruck erscheint.

    
Dmitri 30.07.2015 01:17
quelle
1
  

Warum funktioniert das?

Weil es eine gültige C-Syntax ist. Das Komma in (1,2,3,4,5) ist Kommaoperator

C11: 6.5.17 Komma-Operator

  

Syntax
  1 Ausdruck:

%Vor%      

Semantik
  2 Der linke Operand eines Komma-Operators wird als void-Ausdruck ausgewertet; Zwischen seiner Auswertung und dem des rechten Operanden gibt es einen Sequenzpunkt. Dann wird der rechte Operand ausgewertet; das Ergebnis hat seinen Typ und Wert. 114

  

Was ist der Anwendungsfall für eine solche Zuweisungssyntax?

Siehe das Beispiel unten

  

3 BEISPIEL Wie in der Syntax angegeben, kann der Kommaoperator (wie in dieser Unterklausel beschrieben) nicht in Kontexten vorkommen, in denen ein Komma zur Trennung von Elementen in einer Liste verwendet wird (z. B. Argumente zu Funktionen oder Listen von Initialisierern). Auf der anderen Seite kann es innerhalb eines Klammerausdrucks oder innerhalb des zweiten Ausdrucks verwendet werden   Ausdruck eines bedingten Operators in solchen Kontexten. Im Funktionsaufruf

%Vor%      

Die Funktion hat drei Argumente, von denen das zweite den Wert 5 hat.

    
haccks 30.07.2015 07:22
quelle

Tags und Links