switch - wie aufbauen?



  • volkard schrieb:

    Krux schrieb:

    der switch wurde eingeführt, damit man nicht immer else if(a == b) schreiben muss, also ja ein swich ist eigentlich immer komplett durch eine verkettung von else if ketten ersetzbar, dies ist aber weil es den swich gibt wenig sinnvoll.

    falsch. c++ ist nicht basic.
    switch wurde eingeführt, weil man in asm springen kann auf eine in einer tabelle nachgeguckten adresse (ok, kann man in basic mit on...goto auf dem commodore 64 auch und mit goto x*5+8 auf dem sinclair zx81 auch, aber das gildet nicht, wir nehmen mal nur compilersprachen) und damit bei n sprungzielen O(1) hat und mit der if-orgie mit O(n) abkackt. desdawegen kann switch ja nur integrale konstanten.
    merke: c++ ist nur c mit ein wenig syntaktischem zucker und c ist nur ein etwas besserer makroassembler. wer mir das nicht glaubt, fragt bitte marc++us. der hat ahnung.
    daß c++ dennoch gut taugt, saugroße programme zu schreiben, hat etwas mit bescheidenheit zu tun. aber das ist nicht hier das thema. vielleicht nur als anker: die programmqualität folgt der problemverständnisqualität.

    edit: beim durchlesen stelle ich fest, daß ich mein posting ja selber nicht verstehe. ich würde mich darüber freuen, wenn jemand, der mich versteht, es so umschreibt, daß meine oma es versteht. bei gelingen biete ich dem erklärenden für zwei jahre einen link von meiner www-haupt-seite auf des erklärers seite unter dem text "ErklärBär".

    Zuviel gekifft? 😉

    Einfacher ausgedrückt, der Compiler bastelt sich aus dem Switch ein Array mit ganz vielen Funktionszeigern (oder zu mindest sehr ähnliche Zeiger) und benutzt dann den switch Wert als Index.

    Also aus:

    void foo(int i){
      switch(i){
        case 2:
          printf("a");
        break;
        case 5:
          printf("b");
        break;
        case 0:
          printf("c");
        break;
        default:
          printf("d");
        break;
      }
    }
    

    Macht der

    void printa(){printf("a");}
    void printb(){printf("b");}
    void printc(){printf("c");}
    void printd(){printf("d");}
    
    void foo(int i){
      typedef void(*FPtr)();
      FPtr jmp_table[] = {&printc, &printd, &printa, &printd, &printb};
      if(i<0 || i > 5)
        printd();
      else
        (*(jmp_table[i]))();
    }
    


  • Was hat den nun ein default mit den returns zu tun?

    switch(i){
        case SERVER_REQUEST1:
           return serverRequest1();
        case SERVER_REQUEST2:
           return serverRequest2();
        default:
           return unknownRequest();
        break;
      }
    }
    


  • @CodeFinder schrieb:

    Was hat den nun ein default mit den returns zu tun?

    Die Frage lag mir auch auf den Lippen, hab sie aber (s.o.) wieder wegeditiert. Ich schätze er meint, dass es auch so geht:

    switch (i) {
        case SERVER_REQUEST1:
           return serverRequest1();
        case SERVER_REQUEST2:
           return serverRequest2();
    }
    
    throw UnknownRequestException(); // or any other kind of error handling
    


  • C++ ist nicht wirklich gut geeignet für Exceptions, da man keine Kontrolle hat, dass sie gefangen werden, also lieber nicht.


Anmelden zum Antworten