2013-07-03 7 views
13

Der folgende Java-Code wird nicht kompiliert.Warum können Variablen in einer if-Anweisung nicht deklariert werden?

int a = 0; 

if(a == 1) { 
    int b = 0; 
} 

if(a == 1) { 
    b = 1; 
} 

Warum? Es kann keinen Code-Pfad geben, der zu dem Programm führt, das 1 zu b zuordnet, ohne es zuerst zu deklarieren.

Es fiel mir auf, dass b 's variabler Bereich auf die erste if Anweisung beschränkt sein könnte, aber dann würde ich nicht verstehen, warum. Was, wenn ich nicht unnötig b deklarieren möchte, um die Leistung zu verbessern? Ich mag es nicht, Variablen nach der Deklaration ungenutzt zu lassen.

(Sie können argumentieren, als ich einfach b in der zweiten if Aussage, in diesem Fall erklären könnte, nur vorstellen, dass es irgendwo anders in einer Schleife sein könnte.)

+0

weil b in ersten erklärt hat, wenn der Block und unzugänglich aus dem Block, die b mit einem –

+1

erklärt Was Sie aufgetreten ist richtig. Ihre Variable b ist nur im Umfang für diese bestimmten geschweiften Klammern. – Thihara

+0

Bitte lesen Sie die ** VOLLSTÄNDIGE ** Erklärung. – Aeronth

Antwort

10

Warum? Es kann keinen Codepfad geben, der zu dem Programm führt, das 1 zu b zuweist, ohne es zuerst zu deklarieren.

Sie haben Recht, aber der Compiler weiß das nicht. Der Compiler führt den Code nicht aus. Der Compiler übersetzt nur in Bytecode, ohne Ausdrücke auszuwerten.

26

Variablen können innerhalb eines bedingten deklariert werden Erklärung. Sie versuchen jedoch, auf b in einem anderen Bereich zuzugreifen.

Wenn Sie erklären, b hier:

if(a == 1) { 
    int b = 0; 
} 

Es ist nur in ihrem Umfang bis zum Ende }.

Deshalb, wenn Sie zu dieser Linie kommen:

b = 1; 

b existiert nicht.

1

Es dreht sich alles um Java-Variablen-Scoping.

Sie müssen die variable außerhalb der if statement definieren, um sie außerhalb verwenden zu können.

int a = 0; 
int b = 0; 

if(a == 1) { 
    b = 1; 
} 

if(a == 1) { 
    b = 2; 
} 

Siehe Blocks and Statements

1

Denn wenn b außerhalb des Gültigkeitsbereichs in der ersten geht, wenn (a == 1), dann wird es nicht mehr auf dem Stapel vorhanden entfernt werden und daher nicht in die verwendet werden können, nächste if-Anweisung.

5

Diese { } definiert einen Blockbereich. Alles, was zwischen {} deklariert wird, ist lokal für diesen Block. Das bedeutet, dass Sie sie nicht außerhalb des Blocks verwenden können. Java verbietet es jedoch, einen Namen im äußeren Block durch einen Namen im inneren Block zu verbergen. Dies ist, was JLS sagt:

Der Umfang einer lokalen Variablendeklaration in einem Block (§14.2) ist der Rest des Blocks, in dem die Erklärung erscheint, mit einem eigenen initializer Ausgangs (§14.4) und einschließlich aller weitere Deklaratoren rechts in der lokalen Variablendeklarationsanweisung.

Der Name einer lokalen Variablen v darf nicht als lokale Variable der direkt umschließenden Methode, des Konstruktors oder des Initialisierungsblocks innerhalb des Gültigkeitsbereichs von v deklariert werden, oder es tritt ein Kompilierungsfehler auf.

2

Es ist eine lokale Variable und ist auf den Geltungsbereich {} beschränkt.

Versuchen Sie diese here.

2

Sie b Variable deklariert haben innerhalb wenn Block, die nicht zugänglich out Seite ist die if-Block, und wenn Sie dann setzen außerhalb zugreifen möchten, wenn Block

1

Wenn Sie die Variable innerhalb eines Blocks deklarieren, dann die Begrenzung der Variablenlimits auf den bestimmten Block, in dem sie deklariert wurde.

HINWEIS: Nur statische Variablen haben Zugriff von überall im Programm.

In Ihrem Code:

int a = 0; 

if(a == 1) { 
    int b = 0; 
} 

if(a == 1) { 
    b = 1; 
} 

Variable 'a' kann in jeder if-Anweisung als declare zugegriffen werden außerhalb des Blocks, sondern Variable 'b' ist innen erklären, wenn daher der Einsatz außerhalb des Blocks beschränkt.

Wenn Sie 'b' außerhalb der if-Anweisung verwenden möchten, müssen Sie es deklarieren, wo Sie die Variable 'a' deklariert haben.

1
int a = 0; 

if(a == 1) { 
int b = 0; // this int b is only visible within this if statement only(Scope) 
} 

if(a == 1) { 
b = 1; // here b can't be identify 
} 

Sie haben folgende Art und Weise zu tun, den Fehler korrigieren

int a = 0; 
    int b = 0; 
    if(a == 1) { 
     b=0; 
    } 
    if(a == 1) { 
     b = 1; 
    } 
2

Der Umfang von b zu machen, ist der Block erklärte sie in, das heißt, die erste, wenn. Warum ist das so? Denn diese Scoping-Regel (lexikalisches Scoping) ist leicht zu verstehen, einfach zu implementieren und folgt dem Prinzip der geringsten Überraschung.

Wenn B wurden sichtbar sein, wenn in der zweiten:

  • der Compiler muss äquivalente ableiten würden, wenn Zweige und sie zu einem einzigen Umfang verschmelzen (schwer zu implementieren);
  • Ändern einer Bedingung in einer zufälligen if-Anweisung würde möglicherweise einige Variablen sichtbar machen und andere verborgen (schwer zu verstehen und Quelle von überraschenden Bugs).

Keine vernünftige Sprache hat eine so komplizierte Scoping-Regel.

w.r.t. Leistung - die Angabe einer zusätzlichen Variablen hat einen vernachlässigbaren Einfluss auf die Leistung. Vertraue dem Compiler! Es wird die Register effizient zuweisen.

+0

Matlab hat diese Art von Scoping-Regel Ich fürchte, es ist höllisch. (es ist auch dynamisch, weshalb es mit diesem Wahnsinn überhaupt zurechtkommt). Ah, du hast "nein ** gesunde Sprache" gesagt, okay, ich ziehe meinen Kommentar zurück –

+0

Ja, ich sagte "vernünftig";) Mir war dieser Matlab-Wahnsinn jedoch nicht bewusst. –

1

Nur für Vollständigkeit halber: diese funktioniert auch (Erklärung Scoping finden Sie in den anderen Antworten)

int a = 0; 

if(a == 1) { 
    int b = 0; 
} 

if(a == 1) { 
    int b = 1; 
} 

Durch Scoping, b wird nur innerhalb der if-Anweisungen zugänglich sein. Was wir hier haben, sind eigentlich zwei Variablen, von denen jede nur in ihrem Umfang zugänglich ist.

0

Der Gültigkeitsbereich der Variablen b ist nur so lange gültig, bis der if-Block abgeschlossen ist, da Sie die Variable deklariert haben. Deshalb kann im folgenden Block nicht darauf zugegriffen werden. Dies ist für die Speicherzuweisung, andernfalls wären sie ALLE Variablen, die im Speicher herumlaufen.

int a = 0; 

if(a == 1) { 
    int b = 0;  
} //b scope ends here 

if(a == 1) { 
    b = 1; //compiler error 
} 
Verwandte Themen