switch vs. else if



  • Kann mir mal jemand den unterschied erklären (falls es einen gibt) und mir sagen, warum es switch anweisungen in c++ gibt?

    Ich meine das hier:

    Event e = getEvent();
    switch(e){
    case MouseEvent:
    break;
    case KeyboardEvent:
    break;
    default:
    break;
    }
    

    ist doch genau das gleiche wie das:

    Event e = getEvent();
    if(e == MouseEvent){}
    else if(e == KeyboardEvent){}
    else{}
    

    demnach sind switch anweisungen doch eigentlich überflüssig oder nicht?
    Gehe mal nicht davon aus, dass die wirklich unnötig sind, aber ich sehe von meinem blickwinkel keinen unterschied.

    und besser zu lesen ist es auch mit if-anweisungen anstatt dem case: default: break; zeug



  • Schreibarbeit.
    Du sparst dir das ewige foo ==.
    Obs schneller ist weiß ich nicht.



  • gamer8o4 schrieb:

    und besser zu lesen ist es auch mit if-anweisungen anstatt dem case: default: break; zeug

    Auch nur wenn man so wie du formatiert.

    switch ist eine Fallunterscheidung für Integer-Konstanten und kann übersichtlicher und um einiges schneller sein als eine entsprechende if - else -Kaskade.



  • gamer8o4 schrieb:

    ist doch genau das gleiche

    Ohne die break nicht mehr...



  • gamer8o4 schrieb:

    demnach sind switch anweisungen doch eigentlich überflüssig oder nicht?

    Demnach sind For -Schleifen doch eigentlich überflüssig oder nicht?



  • Nee, while.
    Ich schreibe lieber for(; bar; ) als std::size_t i = 0; while (i < bar) {foo(); ++i;}



  • switch ist eine Fallunterscheidung für Integer-Konstanten und kann übersichtlicher und um einiges schneller sein als eine entsprechende if-else-Kaskade.

    okay, also bei integer-konstanten lieber switch benutzen



  • Nathan schrieb:

    Nee, while.
    Ich schreibe lieber for(; bar; ) als std::size_t i = 0; while (i < bar) {foo(); ++i;}

    Das war doch offensichtlich nicht ernst gemeint.

    @TE: Siehe Antwort von Nexus, der Thread kann geschlossen werden 🙂



  • Meins auch nicht.
    Wenn, dann würde ich lieber auf while verzichten.



  • Ich vermute mal, dass ein Switch fuer den Compiler leichter optimierbar ist (Sprungtabelle).



  • switch-case kann man auch einfacher debuggen. Dann springt der Compiler gleich an die richtige Stelle, bei if-else musst du alle Überprüfungen durchsteppen.



  • Mechanics schrieb:

    switch-case kann man auch einfacher debuggen. Dann springt der Compiler gleich an die richtige Stelle, bei if-else musst du alle Überprüfungen durchsteppen.

    okay, also compileroptimierungen und einfacher zu debuggen. also wenn möglich bevorzugen?!

    Wer von euch nimmt denn öfter switch und wer if?



  • Ich nehm switch, wenn es geht (Typ) und es mehr als zwei Verzweigungen gibt.



  • gamer8o4 schrieb:

    Wer von euch nimmt denn öfter switch und wer if?

    Natürlich nimmt man viel öfter if. switch-case geht ja nur in bestimmten Situationen. Aber wenn du schon sowas wie ein enum oder was ähnliches hast, wo du mehrere Werte abfragen willst, dann bietet sich switch-case eher an.



  • Mechanics schrieb:

    switch-case kann man auch einfacher debuggen. Dann springt der Compiler gleich an die richtige Stelle, bei if-else musst du alle Überprüfungen durchsteppen.

    Was nun aber wirklich kein Grund ist, weshalb switch existiert. C (und C++ schon gar nicht) wurde nicht designt um einfach zu Debuggen zu sein und um schöne Fehlermeldungen zu erhalten.

    @gamer8o4: Es gibt so eine These, dass alle if/else durch Polymorphie ersetzt werden können. Ich habe bei mir nur etwa alle 100 Zeilen ein if (10k Zeilen Statistikgrundlage). Muss auch nicht zwingend Runtimepolymorphie sein, Templates tuns auch. switch habe ich eines bei getopt aber das wars dann auch schon.



  • rofl, den Code will ich sehen. 😃



  • @gamer8o4: Es gibt so eine These, dass alle if/else durch Polymorphie ersetzt werden können. Ich habe bei mir nur etwa alle 100 Zeilen ein if (10k Zeilen Statistikgrundlage). Muss auch nicht zwingend Runtimepolymorphie sein, Templates tuns auch. switch habe ich eines bei getopt aber das wars dann auch schon.

    echt? nur alle 100 zeilen eins? ich glaub ich sollte meinen programmierstil überarbeiten, aber ich wüsste garnicht viele stellen wo ich auf die if anweisungen verzichten könnte 😕 das man das mit templates lösen kann ist bei mir doch eher die ausnahme



  • cooky451 schrieb:

    rofl, den Code will ich sehen. 😃

    Der Code ist ein voll funktionsfähiger Interpreter einer Programmiersprache.

    @gamer8o4: Zeig mal ein paar deiner ifs, dann kann ich mal schauen (und ohne externes C-Zeugs wie dein getEvent(), da hat man wirklich keine Wahl).



  • gamer8o4 schrieb:

    echt? nur alle 100 zeilen eins? ich glaub ich sollte meinen programmierstil überarbeiten

    Du solltest nicht sofort auf alles hören, was dir jemand sagt. Allerdings stimmt es schon, dass man viele if Abfragen tatsächlich umgehen und eleganter lösen kann, eben auch durch Polymorphie oder Templates. Aber bitte nicht alle und schon gar nicht aus Prinzip, sondern nur wenns Sinn macht.



  • Warst du nicht ein Fan von Alexandrescu? Von dem wirst du eine Linked List ohne if-Abfragen finden.

    Btw: Natürlich habe ich ein paar ifs. Eben alle 100 Zeilen. Was ich nicht habe, sind immer wieder ähnliche ifs, die sich wiederholen. Eine verlinkte Liste würde ich zum Beispiel auch mit einem if schreiben.


Anmelden zum Antworten