2013-07-03 8 views
13

Il seguente codice Java non viene compilato.Perché le variabili non possono essere dichiarate in un'istruzione if?

int a = 0; 

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

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

Perché? Non può esserci alcun percorso di codice che porta al programma che assegna 1 a b senza dichiararlo prima.

Mi è venuto in mente che l'ambito della variabile b potrebbe essere limitato alla prima istruzione if, ma non capisco perché. E se davvero non volessi dichiarare b inutilmente, al fine di migliorare le prestazioni? Non mi piace avere le variabili lasciate inutilizzate dopo la dichiarazione.

(Si consiglia di discutere di quanto potessi semplicemente dichiarare B nella seconda if dichiarazione, in questo caso, solo immaginare che potrebbe essere in un ciclo da qualche altra parte.)

+0

perché B ha dichiarato nel primo blocco if e inaccessibile fuori dal blocco, dichiarano la b con un –

+1

Cosa si è verificato a voi è giusto. La variabile b è solo nell'ambito di quella particolare parentesi graffa. – Thihara

+0

Si prega di leggere la spiegazione ** WHOLE **. – Aeronth

risposta

10

Perché? Non può esserci alcun percorso di codice che porti al programma che assegna da 1 a b senza dichiararlo prima.

Hai ragione, ma il compilatore non lo sa. Il compilatore non esegue il codice. Il compilatore si traduce solo in bytecode senza valutare le espressioni.

26

variabili possono essere dichiarate all'interno di un condizionale dichiarazione. Tuttavia, prova ad accedere a b in un ambito diverso.

Quando si dichiara b qui:

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

E 'solo una portata fino alla fine }.

quindi quando si arriva a questa linea:

b = 1; 

b non esiste.

1

È tutto basato sull'oscillazione delle variabili java.

È necessario definire variable al di fuori del se statement per poterlo utilizzare all'esterno.

int a = 0; 
int b = 0; 

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

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

Vedi Blocks and Statements

1

Perché quando b passa nell'ambito nel primo caso (a == 1), allora verrà rimosso e non esiste più in pila e quindi non può essere utilizzato nella prossimo se dichiarazione.

5

Questo { } definisce un ambito del blocco. Qualunque cosa dichiarata tra {} è locale a quel blocco. Ciò significa che non puoi usarli al di fuori del blocco. Tuttavia, Java non consente di nascondere un nome nel blocco esterno con un nome in quello interno. Questo è ciò JLS dice:

L'ambito di una dichiarazione variabile locale in un blocco (§14.2) è il resto del blocco in cui viene visualizzata la dichiarazione, iniziando con un proprio inizializzatore (§14.4), compresi eventuali ulteriori dichiaratori a destra nella dichiarazione di dichiarazione delle variabili locali.

Il nome di una variabile locale v non può essere redeclared come variabile locale del metodo, del costruttore o del blocco di inizializzazione direttamente incluso nell'ambito di v, oppure si verifica un errore di compilazione.

2

È una variabile locale ed è limitata all'ambito {}.

Prova questo here.

1

{ } è usato per definire il campo di variables.And qui hai dichiarato:

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

Così qui portata del B sarà solo in { } .Così si utilizza variabile b fuori { }, sta dando errore di compilazione .

Si può anche fare riferimento a questo:

http://docs.oracle.com/javase/tutorial/java/javaOO/variables.html

2

si è dichiarato b variabile all'interno se il blocco che non è accessibile dal lato blocco if e se si desidera accedere poi mettere fuori se blocco

1

Se si dichiara una variabile all'interno di un blocco, la limitazione della variabile limita il blocco specifico in cui è stato dichiarato.

NOTA: solo le variabili statiche possono accedere da qualsiasi punto del programma.

In te codice:

int a = 0; 

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

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

variabile 'un' può accedere in qualsiasi if come dichiarare all'esterno del blocco ma, variabile 'b' è dichiarare interno se quindi limitato l'utilizzo all'esterno del blocco.

Se si desidera utilizzare 'b' al di fuori dell'istruzione if, è necessario dichiararlo in cui è stata dichiarata la variabile 'a'.

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 
} 

si hanno a che fare seguente modo per rendere correggere l'errore

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

Il campo di applicazione B è il blocco si è dichiarata in, vale a dire, il primo caso. Perchè è così? Poiché questa regola di scoping (scope lessicale) è facile da capire, facile da implementare e segue il principio della sorpresa minima.

Se b dovesse essere visibile nella seconda se:

  • il compilatore avrebbe dovuto dedurre equivalenti se rami e li si fondono in un singolo ambito (difficile da implementare);
  • cambiare una condizione in un'istruzione casuale se potenzialmente renderebbe alcune variabili visibili e altre nascoste (difficile da comprendere e fonte di bug sorprendenti).

Nessun linguaggio sano ha una regola di scoping così complicata.

w.r.t. prestazioni - dichiarare che una variabile extra ha un impatto trascurabile sulle prestazioni. Fidati del compilatore! Assegnerà i registri in modo efficiente.

+0

Matlab ha questo tipo di regola di scoping che ho paura, è infernale. (è anche dinamico, ecco perché può far fronte a questa follia in primo luogo). Ah, hai detto "no ** sane ** lingua", abbastanza giusto, ritengo il mio commento –

+0

Sì, ho detto "sano di mente";) Non ero a conoscenza di questa follia Matlab, però. –

1

Solo per amor di completezza: questo funziona così (spiegazione è scoping, vedere le altre risposte)

int a = 0; 

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

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

causa di scoping, b sarà accessibile all'interno del if unica. Quello che abbiamo qui sono in realtà due variabili, ognuna delle quali è appena accessibile nel loro ambito.

0

l'ambito della variabile b è solo fino al completamento del blocco if, poiché è qui che hai dichiarato la variabile. Questo è il motivo per cui non è possibile accedere al seguente blocco. Questo è per l'allocazione della memoria, altrimenti sarebbero MOLTE variabili che galleggiano nella memoria.

int a = 0; 

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

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