次のJavaコードはコンパイルされません。
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
b = 1;
}
どうして?最初に宣言しないと、プログラムがb
に1を割り当てるコードパスはありません。
b
の変数スコープが最初のif
ステートメントに制限される可能性があることに気付きましたが、その理由を理解できませんでした。パフォーマンスを向上させるために、b
を不必要に宣言したくない場合はどうなりますか?宣言後に変数を未使用のままにしたくない。
(2番目のif
ステートメントで単純にbを宣言するよりも議論したいかもしれません。その場合は、ループがどこか別の場所にあると想像してみてください。)
どうして?最初に宣言しないと、プログラムがbに1を割り当てるコードパスはありません。
あなたは正しいですが、コンパイラはそれを知りません。コンパイラーはコードを実行しません。コンパイラは、式を評価せずにバイトコードにのみ変換します。
変数は条件ステートメント内で宣言できます。ただし、別のスコープでb
にアクセスしてみます。
ここでbを宣言すると:
if(a == 1) {
int b = 0;
}
終了までの範囲内のみ}
。
したがって、この行に来ると:
b = 1;
b
は存在しません。
この{ }
は、ブロックスコープを定義します。 {}
の間に宣言されたものはすべて、そのブロックに対してローカルです。つまり、ブロックの外では使用できません。ただし、Javaは、外部ブロックの名前を内部ブロックの名前で非表示にすることを許可していません。これが [〜#〜] jls [〜#〜] と言うことです:
ブロック内のローカル変数宣言のスコープ(§14.2)は、宣言が現れる残りのブロックであり、独自のイニシャライザ(§14.4)から始まり、ローカル変数宣言ステートメントの右側にさらに宣言子を含めます。
ローカル変数vの名前は、vのスコープ内で直接囲むメソッド、コンストラクター、または初期化子ブロックのローカル変数として再宣言できません。そうでない場合、コンパイル時エラーが発生します。
Java変数スコープについてのすべて。
If variable
を外部で使用できるようにするには、外部でstatement
を定義する必要があります。
int a = 0;
int b = 0;
if(a == 1) {
b = 1;
}
if(a == 1) {
b = 2;
}
ブロックとステートメント を参照してください
これはローカル変数であり、{}スコープに制限されています。
これを試してください ここ 。
ifブロックの外からアクセスできないifブロックの内部でb変数を宣言し、アクセスしたい場合はifブロックの外側に置く
Bのスコープは、それが宣言されているブロック、つまり最初のifです。どうしてこんなことに?このスコープルール(レキシカルスコープ)は理解しやすく、実装も簡単で、驚きもほとんどないという原則に従うためです。
Bが2番目に表示されるとすると、
正気な言語には、このような複雑なスコープルールはありません。
に関して。パフォーマンス-追加の変数を宣言しても、パフォーマンスへの影響はごくわずかです。コンパイラを信頼してください!レジスタを効率的に割り当てます。
完全を期すために、これも機能します(説明はスコープです。他の回答を参照してください)
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
int b = 1;
}
スコーピングのため、bはifステートメント内でのみアクセスできます。ここにあるのは実際にはtwo変数であり、それぞれのスコープ内でアクセスできます。
{ }
は、変数のスコープを定義するために使用されます。ここで宣言しました:
if(a == 1)
{
int b = 0;
}
したがって、ここではbのスコープは{ }
のみになります。したがって、変数bを{ }
の外で使用すると、コンパイルエラーが発生します。
これを参照することもできます:
http://docs.Oracle.com/javase/tutorial/Java/javaOO/variables.html
ブロック内で変数を再宣言すると、変数の制限は、それが宣言された特定のブロックに制限されます。
注:静的変数のみがプログラムのどこからでもアクセスできます。
あなたのコードでは:
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
b = 1;
}
変数 'a'は、ブロックの外側で宣言されているため、ifステートメントでアクセスできますが、変数 'b'は、ブロックの外側での使用が制限されている場合は、内側で宣言されます。
Ifステートメントの外で「b」を使用する場合は、変数「a」を宣言した場所で宣言する必要があります。
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
}
エラーを修正するには、次の方法を実行する必要があります
int a = 0;
int b = 0;
if(a == 1) {
b=0;
}
if(a == 1) {
b = 1;
}
なぜなら、最初のif(a == 1)でbがスコープから外れると、それは削除され、スタックに存在しなくなるため、次のifステートメントで使用できなくなるからです。
変数bのスコープは、変数を宣言した場所であるifブロックが完了するまでです。そのため、次のブロックではアクセスできません。これはメモリ割り当て用です。それ以外の場合は、メモリ内に浮かぶ変数のALOTになります。
int a = 0;
if(a == 1) {
int b = 0;
} //b scope ends here
if(a == 1) {
b = 1; //compiler error
}