Kurze Frage zu switch/case bzw. if



  • Hallo !

    Habe eine kurze Frage:

    void function(int i) {
    int x ;
    switch(i) {
    case 1: 
    break;
    
    case 2:
    break;
    }
    }
    
    ---
    
    void function(int i) {
    switch(i) {
    case 1: 
    int x;
    break;
    
    case 2:
    break;
    }
    }
    
    ---
    
    void function(int i) {
    switch(i) {
    case 1:  {
    int x;
    break;
    }
    case 2:
    break;
    }
    }
    

    Meine Frage nun: verhalten sich hier alle 3 Codeschnippsel gleich ???

    Es geht mir um das Deklarieren von Variablen in Funktionen, in meinem Programm benötige ich manche nur in einem bestimmten fall, so wie oben in case1, wird x deklariert.
    Wird hier nur dann speicherplatz für einen int verwendet, wenn der fall 1 eintritt (case 1:) oder wird x immer deklariert wenn die funktion aufgerufen wird ??

    Das soll nur ein anschauliches beispiel sein, in meinem Programm hab ich mehrere Zeiger (ich weiß die brauchen nur 4 byte auf 32 bit systeme, aber die frage interessiert mich schon länger)

    Hoffe man versteht worauf ich hinaus will 🙂



  • *EDIT*

    Sry hab was vergessen.

    Macht es einen unterschied ob nach dem case 1: der Code in geschweiften klammern steht ? AFAIK heißt dass, das alle Variablen nur in dem bereich sichtbar sind, in dem sie erstelle worden sind.



  • Variante 2 und 3 müssten sich gleich verhalten, Variante 1 deklariert die Variable x ausserhalb der switch-Anweisung, was wohl sinnvoller ist, da du sie dann auch nach der switch-Anweisung verwenden kannst, die beiden anderen deklarierten Variablen sind nach dem Rausspringen aus der switch-Anweisung nicht mehr da. Der Block müsste ignoriert werden weil das Programm schon durch das break aus dem switch rausspringt.



  • Also ist es für die Performance (wenn auch nicht spürbar) besser, wenn man die Variablen die man nur in einem bestimmten Fall benötigt, auch nur dort deklariert ?? Dachte nämlich immer das der Compiler automatisch alle Variablendeklarationen an den Anfang der Funktion schiebt (alter C-Standard).

    Deswegn war ich auch bis jetzt im Glauben das man alle deklarationen, die in einer Funktion vorkommen (auch wenn in einer switch/case verknüpfung) an den Anfang der Funktion schreiben soll/muss !



  • Nicht an den Anfang einer Funktion, an den Anfang eines Blocks. Was Performanz angeht: Eigentlich kostet das Erstellen von Variablen dem Programm doch Zeit. Wenn eine Variable also außerhalb eines Blocks (zB einer for-Schleife) deklariert wird, wird sie nur einmal angefordert und initialisiert. Wird sie innerhalb deklariert, müßte sie doch eigentlich bei jedem Durchlauf neu angefordert werden. Oder wie funktioniert das genau?

    case 1:  {
    int x;
    break;
    }
    

    Die Variable liegt hier in einem eigenen Block hinter case 1: und sollte doch eigentlich auch nur in diesem Block gültig sein.

    Codeschnipsel 1:
    Der integer x ist in der gesamten Funktion gültig.

    Codeschnipsel 2:
    Der integer x ist im gesamten switch/case-Block gültig.

    Codeschnipsel 3:
    Der integer x ist nur im Block von case 1: gültig.

    Vermute ich mal...



  • Danke.

    Danke, habs mal ausprobiert, stimmt alles, bis auf nr.2, man kann keine Variablen in einem Case deklarieren ohne geschweifte Klammern.

    Also ich werd mein Programm mal umschreiben 🙂



  • Hallo
    ICh hätte auch mal noch ne Frage zu switch/case.
    Und zwar möchte ich mit dem switch 2 Variablen abfragen, ungefähr so

    switch (encoder[0] , encoder[1] ) {				
    	     	case 0 , 1:{  r=1; 				
    			break;}
    			case 1 ,0: {	r=0; 					
    			break;}}}
    

    Aber dann bekomme ich folgenden Fehler

    cc51 E042: e:\studium\projekt roboter\test\test1\main.c: line 121: syntax error, expecting statement
    cc51 E014: e:\studium\projekt roboter\test\test1\main.c: line 121: ';' inserted
    cc51 E042: e:\studium\projekt roboter\test\test1\main.c: line 123: syntax error, expecting statement
    cc51 E014: e:\studium\projekt roboter\test\test1\main.c: line 123: ';' inserted



  • switch kann nur einen wert auswerten.

    du musst entweder mit if oder switch_in_switch das machen
    oder mit einem größeren wert

    long long val = encoder[0] | (encoder[1] << 32);
    switch (val)
    {
        case (0 | (1 << 32)):
    //...
    


  • Nagila Hawa schrieb:

    Wenn eine Variable also außerhalb eines Blocks (zB einer for-Schleife) deklariert wird, wird sie nur einmal angefordert und initialisiert. Wird sie innerhalb deklariert, müßte sie doch eigentlich bei jedem Durchlauf neu angefordert werden. Oder wie funktioniert das genau?

    der platz für die variable wird recycled. wenn die variable nicht initialisiert werden muss, kostet das eigentlich keine zeit.
    🙂



  • -fricky- schrieb:

    Nagila Hawa schrieb:

    Wenn eine Variable also außerhalb eines Blocks (zB einer for-Schleife) deklariert wird, wird sie nur einmal angefordert und initialisiert. Wird sie innerhalb deklariert, müßte sie doch eigentlich bei jedem Durchlauf neu angefordert werden. Oder wie funktioniert das genau?

    der platz für die variable wird recycled. wenn die variable nicht initialisiert werden muss, kostet das eigentlich keine zeit.
    🙂

    Das kommt doch ganz auf das System drauf an. Ich denke nicht das darueber im C Standard Aussagen getroffen werden, also man sich standardmaessig darauf verlassen darf. Damit waere es eine Frage des Stils. 😉


Anmelden zum Antworten