2014-02-25 11 views
16

Warum ist dies illegal:Warum können wir eine Variable im Switch nicht zweimal definieren?

switch(x) { 

case 1: 
    int a = 1; 
    break; 
case 2: 
    int a = 2; 
    break; 
} 

Es sieht aus wie es legal gewesen sein könnte. Was sind tiefere Gründe dafür, um illegal zu sein?

+0

Sie scheinen nach dem Schalter auf 'a' zu verweisen. Aber zu welchem ​​"a"? –

+3

Variabler Bereich ist der Name des Spiels. Sie können nicht zwei Variablen mit demselben Namen im selben Bereich haben. – Gimby

+0

@dystroy Nein, nehme an, ich brauche nie eine nach dem Schalter –

Antwort

34

Wenn die Break-Anweisungen nicht verwendet werden, wissen wir, dass die folgenden Fälle ausgeführt werden. Wenn Sie also in beiden Fällen erklären können, dass ein Konflikt entsteht. Zum Beispiel

switch(x) { 

case 1: 
    int a = 1; // i have removed the break; 
case 2: 
    int a = 2; // now what will happen here :) 
    break; 
} 
8

Hier ist nichts mit einer switch hier. Sie können die gleiche Variable nicht zweimal im selben Bereich deklarieren.

Dies ist illegal:

int a = 1; 
int a = 2; 

Nun nehmen wir an, Sie wollten in der Tat, Ihren Fall branchs als Bereiche zu handeln. Dann wäre das Problem, dass Sie die Variable nach dem Wechsel nicht verwenden könnten (außerhalb des Gültigkeitsbereichs).

22

Da der Bereich durch { und } begrenzt ist, und Sie haben die Variable a zweimal.

Sie können diese Übersetzungsfehler vermeiden durch:

switch(x) { 
    case 1: { 
     int a = 1; 
     break; 
    } 
    case 2: { 
     int a = 2; 
     break; 
    } 
} 

Beachten Sie, dass in Ihrem Beispiel der Compiler zum Erfolg versagt, denn wenn man die erste break Anweisung, а etwas entfernen, die fall-through genannt wird passieren könnte :

Alle Anweisungen nach der übereinstimmenden Groß-/Kleinschreibung werden unabhängig vom Ausdruck der nachfolgenden Groß-/Kleinschreibung bis zum Abbruch ausgeführt Ent ist angetroffen.

In diesem Fall sind die Aussagen, die (wegen der Durchfall) ausgeführt werden werden, sind:

  1. int a = 1;
  2. int a = 1;
  3. break;

Und wie Sie sehen können, die a Variable ist dupliziert, weshalb das Kompilieren in Ihrem Beispiel fehlschlägt.

+1

Es ist nutzlos: ein nicht verfügbar nach dem Schalter. –

+0

Was ist der Grund dafür, dass ein Switch genau diesen Umfang hat? –

+3

@dystroy Es ist nutzlos, weil es ein minimales Beispiel für Syntax ist ... –

0

Der Umfang der Variablen in jedem Fall Klausel entspricht die gesamte Schalter Aussage.

Wenn Sie jedoch dieselbe Variable verwenden möchten, können Sie in jeder case-Anweisung einen eigenen Block definieren, indem Sie die geschweiften Klammern {und} verwenden.

0

Sie definieren a innerhalb des lokalen Bereichs des Switches. Als solches weisen Sie a einen Wert zu, aber Sie geben diesen Wert nirgends an, so dass er redundant erscheint.

Wenn Sie a außerhalb des Schalters erklären und dann innerhalb des Schalters anrufen, sollte es funktionieren.

int a; 

switch(x) { 
case 1: 
    a = 1; 
    break; 
case 2: 
    b = 2; 
    break; 
} 

Alternativ jeweils des Schalters, könnten Sie Ihre neue int und dann etwas mit ihm wie so manipulieren:

switch(x) { 
case 1: 
    int a = 1; 
//do something with your new int here that affects a parameter outside the switch 
    break; 
case 2: 
    int b = 1; 
//do something with your new int here that affects a parameter outside the switch 
    break; 
} 

Plus, es scheint, dass eine Variable mehrfach in einem bestimmenden switch ist aufgrund von Konflikten unzulässig, da die Variable a im lokalen Bereich definiert ist, um im ersten Fall des Switches eine Sache zu bedeuten. Daher können Sie es im zweiten Fall nicht als etwas anderes definieren.

2

Die switch-Anweisung ist ein Codeblock. Die switch-Anweisung evaluiert ihren Ausdruck und führt dann alle Anweisungen aus, die der übereinstimmenden Groß-/Kleinschreibung folgen.

In diesem Fall wertet es x aus und dies wird mit jeder Konstante verglichen, bis eine Übereinstimmung gefunden wird.

Aber eigentlich ist es wie wenn man sagt:

for(int i = 0; i < 4; i++) { 
    int i = 1; 
} 

dies wird auch nicht funktionieren, weil i ist bereits definiert.

0

Gehen Sie mit diesen Fakten: -> Sie können nicht die gleiche lokale Variable zweimal im einzelnen Bereich deklarieren. ->case erstellt keinen eigenen Bereich. ->switch, ja erstellt einen eigenen Bereich. -> Beweis: Wenn Sie keinen Fall break einen Fall, werden alle Fälle ausgeführt, es sei denn, sie erfüllen die Bedingung. (anders als wenn nicht).

Verwandte Themen