2012-03-24 12 views

Antwort

2

Die Frage in erster Linie um die Aussagen dreht

c=a,b; 
d=(a,b); 

Der = Betreiber niedriger precendence als der , Operator hat, so dass die erste Anweisung bedeutet:

(c=a),b; 

, der Operator gibt den Wert des zweiten Operanden, so dass die zweite Anweisung bedeutet:

a,(d=b); 
6

Ihr Code:

a=3; 
b=5; 
c=a,b; 
d=(a,b); 

behandelt wird, als ob es geschrieben wurde:

a=3; 
b=5; 
(c=a),b; 
d=(a,b); 

Das warum c == 3 und d == 5 ist.

Ein guter Compiler warnt Sie vielleicht vor der Zeile mit der Zuweisung an c; Die Auswertung von b führt nicht zum Stand der Berechnung. Ähnlich für die Auswertung von a im Ausdruck für d.


Was d=(a,b) — wie funktioniert es d=5 in der Ausgabe angezeigt werden?

Der Komma-Operator ist die niedrigste Priorität aller in C. Es ist auch wichtig, dass die Kommas in der Argumentliste einer Funktion zu erinnern, sind nicht Komma Operatoren.

Das Verhalten des Komma-Operator exemplifiziert durch:

x, y; 

ist der Ausdruck x verwerfen und das Ergebnis dann bewerten, die Expression y (und das Gesamtergebnis ist der Wert von y) zu bewerten. Es gibt einen Sequenzpunkt am Komma-Operator; das ist eine Verfeinerung, die dir jetzt egal ist, aber vielleicht in der Zukunft.

In Ihrem Ausdruck:

d = (a, b); 

der Ausdruck a ausgewertet wird (es ist 3) und ignoriert; dann wird der Ausdruck b ausgewertet (es ist 5), und das wird als das Ergebnis des Komma-Operatorausdrucks und daher des eingeklammerten Ausdrucks verwendet, und daher wird der Wert 5 d zugewiesen.

Im Gegensatz dazu in Ihrem Ausdruck:

c = a, b; 

die LHS des Komma-Operator ist c = a, so a ausgewertet wird (es ist 3) und c zugeordnet. Dieser wird dann weggeworfen und b wird ausgewertet. Die allgemeine Ausdrucksanweisung weist daher 3 nur c zu.

Sie könnten sich fragen: "Warum ist der Komma-Operator nützlich?"

Es gibt Orte, wo es sinnvoll ist, wie die Initialisierung und Zuwachs Abschnitte einer for Schleife:

for (i = 0, s = p; *s != '\0'; i++, s++) 
{ 
    ... 
} 

Es gibt zwei Komma Betreiber gibt. Die erste enthält ein Paar Zuordnungen; Die zweite enthält ein Paar Ausdrücke mit Nebenwirkungen.

Ein weiterer Ort, wo es manchmal verwendet wird (obwohl ich behaupten würde es selten guter Stil ist), ist:

if (some_variable == A_VALUE) 
    p = q++, r = z; 

Diese ‚spart‘ Klammern um den Zustand Körper zu müssen. Es ist jedoch kein guter Stil, solche Aufgaben zu verbergen. Der Code sollte sein (geben oder die Platzierung von Klammern nehmen, was umstritten ist):

if (some_variable == A_VALUE) 
{ 
    p = q++; 
    r = z; 
} 

Wenn Sie wie Obfuscated C, da die International Obfuscated C Code Contest ist.

Wenn Sie Makros schreiben, kann der Komma-Operator manchmal ein Lebensretter sein.

+0

was ist mit d = (a, b) Wie zeigt es d = 5 in der Ausgabe? –

0

OK, werde ich doit

c=a,b; 

Means tun:

c=a; 
b; 

d=(a,b); 

Mittlere tun: ein; b; das letzte "Ergebnis" d zuweisen;

"," Komma trennt zwei Anweisungen. Die Rückkehr der letzten Aussage ist das Ergebnis der kombinierten Aussagen

0

Ihr Ausgang wird sein c = 3 d = 5; , um das Ergebnis zu visualisieren, sollten Sie die Assoziativität von {=} - Zuweisungsoperator und {,} - Kommaoperator kennen. -> weil Zuweisung (=) Vorrang vor Komma nimmt (,) Ihre erste Aussage c = a, b entspricht

(a=3),5; 

Ausdrücke durch Kommata getrennt sind immer links nach rechts ausgewertet. So ist der Wert eines Ausdrucks

(expr1, expr2)

ist immer der Wert des letzten Ausdrucks. Daher ist in Ihrer zweiten Aussage d = (a, b) das Ergebnis der rechten Seite d = 5 ...

Verwandte Themen