Warum muss man switch-anweisungen breaken?



  • hallo

    warum muss man das? folgender code:

    int i = 1;
        switch(i)
        {
        	case 0: ShowMessage("0");
            case 1: ShowMessage("1");
            case 2: ShowMessage("2");
            case 3: ShowMessage("3");
        }
    

    führt dann case 2: und case 3: auch noch aus. und das nur weil man die case blöcke ohne ein break verseht. aber das macht doch keinen sinn, weil i ist nunmal nicht 2 oder 3. warum also ist der fall dennoch erfüllt?



  • Weil es viele Anwendungsfälle gibt, bei denen der Code nach der nächsten case -Sprungmarke ebenfalls noch ausgeführt werden soll.



  • achso danke. demnach also eine standard regelung die das besagt? und gehe ich richtig der annahme das man die letzte anweisung (auch default) nie breaken muss? macht ja auch keinen sinn, kommt ja nichts mehr danach.



  • switchy schrieb:

    achso danke. demnach also eine standard regelung die das besagt?

    Ja.

    switchy schrieb:

    und gehe ich richtig der annahme das man die letzte anweisung (auch default) nie breaken muss? macht ja auch keinen sinn, kommt ja nichts mehr danach.

    Genau. Bei normalen case -Marken mach ich es zwar aus Konsistenzgründen, ist auch praktisch, wenn man nachträglich noch eine Marke hinzufügen will. Bei default jedoch nie. Aber das ist dir selbst überlassen.



  • Müssen nicht, vielleicht ist es aber trotzdem ganz sinnvoll. Wenn jemand später einen weitern Fall hinzufügt muß er nicht den davor noch um ein break ergänzen.



  • switchy schrieb:

    achso danke. demnach also eine standard regelung die das besagt? und gehe ich richtig der annahme das man die letzte anweisung (auch default) nie breaken muss? macht ja auch keinen sinn, kommt ja nichts mehr danach.

    Es gibt aber auch keinen Grund, es nicht zu tun. Wenn du später weitere Fälle hinzufügst, übersiehst du leicht das fehlende break .
    Ich benutze case grundsätzlich immer mit break und in den Ausnahmefällen wo ich es nicht tue, kommentiere ich explizit, dass und warum das break fehlt.



  • gute tipps. danke euch beiden 😋



  • Ein klassischer Anwendungsfall für dieses "fall-through" Verhalten ist, wenn man mehrere Fälle exakt gleich behandeln will:

    void foo(int i)
    {
        switch (i)
        {
        case 1:
        case 2:
            one_or_two();
            break;
    
        case 3:
        case 4:
            three_or_four();
            break;
    
        default:
            invalid_parameter();
            break;
        }
    }
    

    (Das ist übrigens auch die einzige Variante in der das in C# noch erlaubt ist. Sobald irgendwelcher Code zwischen "case 1" und "case 2" stehen würde, wäre es in C# verboten.)

    Ein anderer Anwendungsfall wäre Duff's Device: http://en.wikipedia.org/wiki/Duff's_device


Anmelden zum Antworten