Warum funktionieren „return“, „Continue“ oder „break“ nicht mit dem Komma-Operator?
Lesezeit: 4 Minuten
Nayem
Ich kann den Code schreiben if(1) x++, y++; Anstatt von if(1) {x++; y++;}, aber in einigen Fällen funktioniert es nicht (siehe unten). Es wäre nett, wenn du mir davon erzählst.
int x = 5, y = 10;
if (x == 5) x++, y++; // It works
if (x == 5) x++, return 0; // It shows an error
Gleiches gilt für for Schleifen:
for (int i = 0; i < 1; i++) y++, y += 5; // It works
for (int i = 0; i < 1; i++) y++, break; // Does not work
Sie müssen den Unterschied zwischen lernen Ausdrücke und Aussagen.
– Irgendein Programmierer-Typ
21. August 2018 um 6:40 Uhr
Beachten Sie auch, dass mit das Komma Ausdruck Die Art und Weise, wie Sie dies tun, macht den Code schwieriger zu lesen, zu verstehen und zu warten.
– Irgendein Programmierer-Typ
21. August 2018 um 6:42 Uhr
Denn so ist die Syntax für den Komma-Operator nicht definiert … und das war’s auch schon.
– Ludin
21. August 2018 um 6:54 Uhr
Aus dem gleichen Grund int i = break; funktioniert nicht.
– Peter – Setzen Sie Monica wieder ein
21. August 2018 um 15:09 Uhr
Warum willst du das überhaupt tun? Verwenden Sie einfach Klammern. Es ist viel klarer und einfacher zu verstehen.
– Nik
21. August 2018 um 20:23 Uhr
Rakete1111
Das ist, weil return und break sind Aussagen, keine Ausdrücke. Daher können Sie es in keiner Weise in einem anderen Ausdruck verwenden. if und die anderen sind ebenso auch Aussagen.
Was Sie jedoch tun können, ist, Ihren Ausdruck umzuschreiben (z return), damit es nicht in einem Ausdruck verschachtelt ist – nicht, dass ich empfehlen würde, Code wie diesen zu schreiben:
return x++, 0;
Das kannst du nicht tun break weil es keinen Ausdruck akzeptiert.
Eine schöne Illustration: Es gibt keinen nennenswerten syntaktischen Unterschied zwischen x++ / 7 und x++, 7 (beide / und , Operatoren sein). Aus dem gleichen Grunde, x++, break macht so viel Sinn wie x++ / break: überhaupt keine.
– Amadan
21. August 2018 um 6:47 Uhr
@Amadan Schöne Illustration! Ich werde es sicher das nächste Mal verwenden, wenn ich das erklären muss 🙂 Danke
– Rakete1111
21. August 2018 um 6:49 Uhr
@Amadan Es gibt einen sehr signifikanten Unterschied (zumindest vor C ++ 17, nicht sicher über die neuen Regeln): Der Kommaoperator induziert eine Happening-Before-Beziehung (oder führt in alten Begriffen einen Sequenzpunkt ein), was das bedeutet x++, x++ definiert ist, während x++ / x++ ist nicht definiert.
– Sebastian Redl
21. August 2018 um 7:56 Uhr
@SebastianRedl: Es gibt auch die Tatsache, dass , gibt den zweiten Operanden zurück, aber / teilt die Dinge, was meiner Meinung nach ein etwas bedeutenderer Unterschied ist 😀 . Syntaktisch unterscheiden sie sich jedoch nur durch den Vorrang (hier vereinfacht, hier realistischer).
– Amadan
21. August 2018 um 8:05 Uhr
ABER bitte nicht
– edc65
21. August 2018 um 13:39 Uhr
Yunnosch
Der Kommaoperator ist für Ausdrücke.
Das return Aussage und andere reine Aussagen sind keine Ausdrücke.
Und das Fazit?
– Peter Mortensen
21. August 2018 um 15:03 Uhr
@PeterMortensen Ich antwortete auf das “Warum?” Frage, nicht wahr? Worum geht es dir?
– Yunnosch
21. August 2018 um 15:48 Uhr
David Dubois
Der Kommaoperator ist ein binärer Operator, der zwei Werte annimmt. Auf diese Weise ist es dasselbe wie + oder *. Wohingegen + addiert zwei Werte und gibt das Ergebnis zurück, und * zwei Werte multipliziert und das Ergebnis zurückgibt, ignoriert der Kommaoperator einfach den Wert links und gibt den Wert rechts zurück.
2 + 5 Wert hat 7
2 * 5 Wert hat 10
2 , 5 Wert hat 5einfach der Operand rechts vom Operator.
Und so kannst du nicht schreiben 2,break aus dem gleichen Grund, aus dem du nicht schreiben kannst 2+break. Denn break ist eine Aussage, kein Wert.
Was nützt ein binärer Operator, der einen seiner Operanden ignoriert? Der Kommaoperator ignoriert den Wert des linken Operanden, aber der Ausdruck wird trotzdem ausgewertet. Alle Nebeneffekte dieses Ausdrucks werden immer noch realisiert. In Betracht ziehen:
i = 2;
j = 5;
i++, j++;
Zuerst werden die beiden Ausdrücke ausgewertet. i++ gibt den Wert zurück 2und dann inkrementiert i. j++ gibt den Wert zurück 5und dann inkrementiert j. Schließlich wird der Kommaoperator auf diese beiden Werte angewendet: 2,5 das ignoriert die 2 und gibt die zurück 5.
Ich glaube nicht, dass es den Wert auf der linken Seite ignoriert, sondern tatsächlich den Ausdruck auf der linken Seite auswertet und den Ausdruck auf der rechten Seite zurückgibt.
– Thomas Matthäus
21. August 2018 um 18:42 Uhr
Ja, es wertet den Ausdruck aus, … und ignoriert dann seinen Wert. Ich habe bearbeitet, um es klarer zu machen. Vielen Dank.
– David Dubois
21. August 2018 um 19:23 Uhr
Nayem, war das überhaupt hilfreich?
– David Dubois
22. September 2018 um 12:31 Uhr
@DavidDubois Warum sagen alle break ist eine aussage Es ist nicht! break; ist. (Entschuldigung, ich bin nur pedantisch 🙂
– LF
28. März 2019 um 14:21 Uhr
LF, du hast Recht. Wie würden Sie die Lücke ausfüllen? ‘break’ ist ein ____, kein Wert.
– David Dubois
28. März 2019 um 16:03 Uhr
14336400cookie-checkWarum funktionieren „return“, „Continue“ oder „break“ nicht mit dem Komma-Operator?yes
Sie müssen den Unterschied zwischen lernen Ausdrücke und Aussagen.
– Irgendein Programmierer-Typ
21. August 2018 um 6:40 Uhr
Beachten Sie auch, dass mit das Komma Ausdruck Die Art und Weise, wie Sie dies tun, macht den Code schwieriger zu lesen, zu verstehen und zu warten.
– Irgendein Programmierer-Typ
21. August 2018 um 6:42 Uhr
Denn so ist die Syntax für den Komma-Operator nicht definiert … und das war’s auch schon.
– Ludin
21. August 2018 um 6:54 Uhr
Aus dem gleichen Grund
int i = break;
funktioniert nicht.– Peter – Setzen Sie Monica wieder ein
21. August 2018 um 15:09 Uhr
Warum willst du das überhaupt tun? Verwenden Sie einfach Klammern. Es ist viel klarer und einfacher zu verstehen.
– Nik
21. August 2018 um 20:23 Uhr