egal ob Komma oder Semikolon, Compiler meckert nicht, warum?
-
Hallo zusammen,
ich habe in meinem Programm eine Zeile, die so aussieht:
...
var_1 = var_2; var_3 = var_4, var_5 = var_6;
...es lief immer schön ohne Probleme
ein Kollege hat jetzt einen "Fehler" gefunden, und zwar muss statt des Kommas auch ein Semikolon stehen, also:
...
var_1 = var_2; var_3 = var_4; var_5 = var_6;
...Wie gesagt, es macht bei der Rechnung keinen Unterschied, und der Compiler meckert auch nicht. Wie kann das? Darf ich mehrere Anweisungen auch mit Komma trennen? Bedeutet es wirklich genau das gleiche?
Liebe Grüße, Susanne
-
Ja es geht und nein, es ist nicht das Gleiche, wie du ja schon bemerkt hast.
var_1 = var_2; var_3 = var_4; var_5 = var_6; ist ja klar, was er macht und bei var_1 = var_2; var_3 = var_4, var_5 = var_6; müsstest du es dir glaube ich so denken:
var_1 = var_2;
var_3 = var_4;
var_3 = var_5 = var_6;
-
feigling schrieb:
Ja es geht und nein, es ist nicht das Gleiche, wie du ja schon bemerkt hast.
var_1 = var_2; var_3 = var_4; var_5 = var_6; ist ja klar, was er macht und bei var_1 = var_2; var_3 = var_4, var_5 = var_6; müsstest du es dir glaube ich so denken:
var_1 = var_2;
var_3 = var_4;
var_3 = var_5 = var_6;Bist Du sicher? Der Zuweisungs-Operator bindet doch stärker als der Komma-Operator, von daher musste beide Zeilen in diesem Falle tatsächlich dasselbe machen. Der imho einzige - hier unbedeutende - Unterschied ist, dass es im zweiten Fall drei Ausdrücke sind, im ersten Fall zwei, wobei der zweite Ausdruck "var3 = var4, var5 = var6" zusammengenommen das Ergebnis des rechten Teilausdrucks als Rückgabewert hat.
-
Hallo Feigling,
Danke für Deine Antwort,
aber so kann es auch nicht sein, wenn ich mir die Werte ausgegeben lasse, habe ich beide Male das gleiche ergebnis. Also in var_3 steht nachher wirklich, was vorher in var_4 stand, und nicht das gleiche wie in var_5 bzw. var_6.
Liebe Grüße, Susanne
-
Feigling, das ist komplett falsch.
Feldsalat: Das ist der Komma-Operator. Der Operator mit der niedrigsten Priorität. Ein Ausdruck der Form A, B wird streng von links nach rechts ausgewertet, das Ergebnis ist B, das Ergebnis von A wird verworfen. Der Unterschied zur Anweisungssequenz A; B; ist folgender:
A, B ist ein Ausdruck, hat also ein Ergebnis. Anweisungen haben nur einen Effekt, kein Ergebnis. Ausdrücke dürfen überall stehen, wo Anweisungen stehen dürfen, aber nicht umgekehrt. Außerdem ist A,B als Ausdruck auch nur eine Anweisung, A;B; sind zwei Anweisungen.Wirklich brauchen tut man den Komma-Operator nur an ganz wenigen Stellen, überall da, wo nur eine Anweisung oder ein Ausdruck stehen darf, man aber gerne mehrere Aktionen ausgeführt haben will. Man sieht das manchmal in for-Schleifen:
for (...; ...; i++, j++)
(hier wird erst i, dann j inkrementiert, beide Ergebnisse werden verworfen)
In deinem Beispiel macht es keinen Unterschied. Das Komma ist also stilistisch falsch, man sollte mit selten benötigten Sprachmitteln sparsam umgehen, und sie außerdem nur einsetzen, wenn sie wirklich gebraucht werden.
-
Stilistisch falsch sind auch die nicht vorhandenen newlines. Die kann man ruhig spendieren, der Compiler optimiert die eh weg
-
LordJaxom schrieb:
feigling schrieb:
Ja es geht und nein, es ist nicht das Gleiche, wie du ja schon bemerkt hast.
var_1 = var_2; var_3 = var_4; var_5 = var_6; ist ja klar, was er macht und bei var_1 = var_2; var_3 = var_4, var_5 = var_6; müsstest du es dir glaube ich so denken:
var_1 = var_2;
var_3 = var_4;
var_3 = var_5 = var_6;Bist Du sicher? Der Zuweisungs-Operator bindet doch stärker als der Komma-Operator, von daher musste beide Zeilen in diesem Falle tatsächlich dasselbe machen. Der imho einzige - hier unbedeutende - Unterschied ist, dass es im zweiten Fall drei Ausdrücke sind, im ersten Fall zwei, wobei der zweite Ausdruck "var3 = var4, var5 = var6" zusammengenommen das Ergebnis des rechten Teilausdrucks als Rückgabewert hat.
Nope, hatte mich da wirklich vertan und habe das falsch in Erinnerung gehabt. Wodran ich gedacht habe war sowas wie
c = (a++, b++, a--, a+=2);
aber da sind ja noch Klammern :x
-
Hallo zusammen,
vielen Dank
Jetzt bin ich wieder ein bißchen schlauer
Liebe Grüße, Susanne
-
fang am besten nach jedem semikolon eine neue zeile an, dann fällt sowas seltsames eher auf.