Pourquoi les variables ne peuvent-elles pas être déclarées dans une instruction if?
Le code Java suivant ne compile pas.
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
b = 1;
}
Pourquoi? Il peut y avoir aucun code n'chemin conduisant au programme d'attribution de 1 à b
sans la déclarer en premier.
Il m'est apparu que b
's variable de portée peut être limitée à la première if
déclaration, mais alors je ne comprends pas pourquoi. Que faire si je ne veux vraiment pas à déclarer b
inutilement, afin d'améliorer les performances? Je n'aime pas avoir des variables reste inutilisée après la déclaration.
(Vous pouvez argumenter que je peut simplement déclarer b dans la deuxième if
déclaration, dans ce cas, il suffit d'imaginer que cela pourrait être dans une boucle quelque part d'autre.)
source d'informationauteur Aeronth | 2013-07-03
Vous devez vous connecter pour publier un commentaire.
Vous avez raison, mais le compilateur ne sait pas que. Le compilateur ne pas exécuter le code. Le compilateur ne traduit en bytecode, sans évaluer des expressions.
Variables peuvent être déclarées à l'intérieur d'une instruction conditionnelle. Cependant, vous essayez d'accès et
b
dans un autre champ.Lorsque vous déclarez b ici:
C'est uniquement dans la portée jusqu'à la fin
}
.Donc quand vous venez à cette ligne:
b
n'existe pas.Ce
{ }
définit un bloc de portée. Rien déclarée entre{}
est locales à ce bloc. Cela signifie que vous ne pouvez pas les utiliser en dehors du bloc. Mais Java n'autorise pas cacher un nom à l'extérieur du bloc par un nom dans l'intérieur. C'est ce que JLS dit :Son tout au sujet de java variable de portée.
Vous devrez définir la
variable
à l'extérieur de la sistatement
pour être en mesure de l'utiliser à l'extérieur.Voir Les blocs et les États
C'est une variable locale et limitée à l' {} portée.
Essayer cette ici.
vous avez déclaré la variable b à l'intérieur si le bloc qui n'est pas accessible en dehors de la si le bloc et si vous souhaitez accéder, puis de les mettre à l'extérieur si le bloc
Le champ d'application de b est le bloc elle est déclarée, qui est, la première si. Pourquoi donc? Parce que cette détermination de la portée de la règle (portée lexicale) est facile à comprendre, facile à mettre en œuvre, et suit le principe de moindre surprise.
Si b ont été visibles dans la seconde si:
Pas sain d'esprit de la langue a un complexe de portée de la règle.
w.r.t. performance - la déclaration d'une variable supplémentaire a un impact négligeable sur les performances. Confiance le compilateur! Il va allouer des registres efficacement.
Parce que quand b est hors de portée dans le premier if (a == 1) alors il sera enlevé et n'existe plus sur la pile et ne peut donc pas être utilisé dans la prochaine instruction if.
{ }
est utilisé pour définir la portée des variables.Et ici, vous avez déclaré :Voici donc la portée de b sera seulement en
{ }
.Si vous utilisez la variable b à l'extérieur de{ }
c'est de donner une erreur de compilation.Vous pouvez également consulter cette:
http://docs.oracle.com/javase/tutorial/java/javaOO/variables.html
Si vous re déclarant la variable à l'intérieur d'un bloc de la limitation de la variable limites de l'îlot dans lequel il a obtenu déclaré.
REMARQUE : Seules les variables statiques a accès à partir de n'importe où dans le programme.
Dans vous code :
la variable 'a' peut être consulté en tout cas l'énoncé de ses déclarer à l'extérieur du bloc, mais, la variable " b " est de déclarer à l'intérieur si donc limité son utilisation à l'extérieur du bloc.
Si vous souhaitez utiliser le 'b' à l'extérieur de l'instruction si vous devez déclarer à l'endroit où vous avez déclarer la variable "a".
que vous avez à faire façon suivante pour faire corriger l'erreur
Juste par souci d'exhaustivité: celui-ci fonctionne aussi bien (explication est la portée, voir les autres réponses)
En raison de la portée, b ne sera accessible qu'à l'intérieur de l'if. Ce que nous avons ici sont en fait des deux variables, chaque de ce qui est seulement accessible dans leur champ d'application.
la variable b est le champ est seulement jusqu'à ce que le bloc si complète, que c'est là que vous avez déclaré la variable. C'est pourquoi il ne peut pas être consulté sur le bloc suivant. C'est pour l'allocation de mémoire, sinon ils auraient BEAUCOUP de variables qui flottent dans la mémoire.