was macht C da?
-
bei
int val=(1,2);
wird val der wert 2 zugewiesen
nach welcher Regel geht das?
-
nach welcher Regel geht das?
Nach der Regel für die Auswertung des Kommaoperators.
Dieser wird von links nach rechts ausgewertet. Das Ergebnis des Ausdrucks ist das Ergebnis des rechten Ausdrucks:
void foo() {} int bar() {return 4;} int main() { int i = (foo(), bar(), 22); }
Hier wird erst foo(), dann bar() und dann 22 ausgewertet. Das Ergebnis des Gesamtausdrucks ist das Ergebnis der Auswertung des am weitesten rechts liegenden Ausdrucks. Hier ist also das Ergebnis vom Typ int und hat den Wert 22.
PS: Dein Beispiel macht natürlich keinen Sinn, da die Auswertung von 1 keinen irgenwie zu gebrauchenen Seiteneffekt hat.
[ Dieser Beitrag wurde am 20.06.2003 um 10:38 Uhr von HumeSikkins editiert. ]
-
das machte sinn mit
double val=sqrt(1,0-val2);
es handelte sich dabei um nen tippfehler
1,0 anstelle von 1.0
-
sorry hab das Danke vergessen...
...Danke fuer die antwort
-
Also sehe ich das richtig?
int global = 10; void foo() { global *= 10; } void bar() { global -= 4; } int main() { int i = (foo(), bar(), global); }
Ist i jetzt 96 oder was?
-
Ja.
-
i ist jetzt 96.
Sorry für Doppelpost. Ist mir zu spät eigefallen, das Ja etwas kurz ist.
-
Original erstellt von <C Newbie>:
i ist jetzt 96.Sicher? IIRC ist beim Kommaoperator (wie auch bei so gut wie allen anderen) die Auswertungsreihenfolge undefiniert.
-
Also in C wird der Kommapertaor von links nach rechts ausgewertet. Bin mir im Moment nicht sicher, ob das auch für C++ gilt.
-
Ups, ich sehe grade, dass Hume oben schon die Antwort auf die Frage der Auswertung gegeben hat:
Nach der Regel für die Auswertung des Kommaoperators.
Dieser wird von links nach rechts ausgewertet.
-
wenn die Reihenfolge der Auswertung undefiniert wär, dann würde der , Operator doch eigentlich keinen Sinn machen
-
Original erstellt von kingruedi:
wenn die Reihenfolge der Auswertung undefiniert wär, dann würde der , Operator doch eigentlich keinen Sinn machendoch.
a) zum leute-ärgern. siehe double a[3,4]; nebst allen anderen cout<<a[x,y]
b) zum klammern-sparen bei while(bla)x*=1.01,y*=1.02;
c) als abschreckendes beispiel.
-
wenn man den Kommaoperator überlädt, wird die Reihenfolge übrigens undefiniert.
-
-
Sicher? IIRC ist beim Kommaoperator (wie auch bei so gut wie allen anderen) die Auswertungsreihenfolge undefiniert.
Es gibt Situationen in denen ein Komma auftritt und die Auswertungsreihenfolge nicht festgelegt ist. Das gilt z.B. für die Auswertung von Funktionsargumenten (die ja bekanntlich durch ein Komma getrennt sind). In diesem Fall ist das Komma aber nicht im Sinne des Komma-Operators aktiv sondern nur als Trennzeichen.
Überall dort, wo das Komma den Komma-Operator repräsentiert und wo selbiger Operator nicht Überladen wurde ist die Auswertungsreihenfolge durch den Standard garantiert.