2012-06-19 20 views

Antwort

8

Die Initialisierung von Variablen in Schalteranweisungen ist eine schlechte Vorgehensweise und ein undefiniertes Verhalten.

+0

Aber Variable b wird zu 20 deklariert, Compiler weiß, wie viel Platz Variable b nehmen wird und was dort zu speichern ist. Warum ist das Verhalten dann undefiniert? – Anon

+0

@Anon: Es ist nicht Teil eines Labels. –

+0

hab es, danke. – Anon

5

Wenn Sie Ihre Compiler-Warnungen auftauchen werden Sie sehen:

warning: ‘b’ may be used uninitialized in this function 

Das ist keine gültige Stelle b, zu initialisieren und daher enthält es uninitialised Daten zu dem Zeitpunkt statt 20 zu drucken sind Sie verursacht undefiniertes Verhalten.

-2

Es ist ein var Bereich Problem. Wenn Sie umziehen

int b=20; 

Außerhalb des Schalterblocks wird es funktionieren.

6

Die switch-Anweisung hat folgende Struktur:

switch (expression){ 

    // declarations 

    case constant-expression : 
     ... 
    case constant-expression : 
     ... 
    default : 
     ... 
} 

Der Deklarationsabschnitt bei der Kompilierung verwendet wird, Variablen zu deklarieren, aber nicht während der Laufzeit verwendet, um sie (keine Aussagen in diesem Abschnitt zu initialisieren ausgeführt werden, und zwar). Nicht der Unterschied zwischen dem Deklarieren und Initialisieren einer Variablen. Da b ist intialized nie Code das gleiche Ergebnis wie hat:

int main(){ 
    int b; 
    printf("b is %d\n", b); 

    return 0; 
} 

, die eindeutig nicht definiert ist. Das Kompilieren mit dem -Wall Flag wird feststellen, dass Sie einen nicht initialisierten Wert verwenden.

0

Die switch Anweisung hat ein goto auf die entsprechenden case Aussage basierend auf dem Wert des switch Variable und nichts mehr. Gerade jetzt umgehen Sie die Initialisierung von b, so dass es ausdrucken wird, was zu diesem Zeitpunkt an diesem Ort im Speicher war.

Verwandte Themen