Warum funktionieren „return“, „Continue“ oder „break“ nicht mit dem Komma-Operator?

Lesezeit: 4 Minuten

Benutzeravatar von Nayem
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

Benutzeravatar von Rakete1111
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

Benutzeravatar von Yunnosch
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

Benutzeravatar von David Dubois
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

1433640cookie-checkWarum funktionieren „return“, „Continue“ oder „break“ nicht mit dem Komma-Operator?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy