web-dev-qa-db-ja.com

ifステートメントで変数を宣言できないのはなぜですか?

次のJavaコードはコンパイルされません。

int a = 0;

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

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

どうして?最初に宣言しないと、プログラムがbに1を割り当てるコードパスはありません。

bの変数スコープが最初のifステートメントに制限される可能性があることに気付きましたが、その理由を理解できませんでした。パフォーマンスを向上させるために、bを不必要に宣言したくない場合はどうなりますか?宣言後に変数を未使用のままにしたくない。

(2番目のifステートメントで単純にbを宣言するよりも議論したいかもしれません。その場合は、ループがどこか別の場所にあると想像してみてください。)

23
Aeronth

どうして?最初に宣言しないと、プログラムがbに1を割り当てるコードパスはありません。

あなたは正しいですが、コンパイラはそれを知りません。コンパイラーはコードを実行しません。コンパイラは、式を評価せずにバイトコードにのみ変換します。

13
TomWolk

変数は条件ステートメント内で宣言できます。ただし、別のスコープでbにアクセスしてみます。

ここでbを宣言すると:

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

終了までの範囲内のみ}

したがって、この行に来ると:

b = 1;

bは存在しません。

30
Darren

この{ }は、ブロックスコープを定義します。 {}の間に宣言されたものはすべて、そのブロックに対してローカルです。つまり、ブロックの外では使用できません。ただし、Javaは、外部ブロックの名前を内部ブロックの名前で非表示にすることを許可していません。これが [〜#〜] jls [〜#〜] と言うことです:

ブロック内のローカル変数宣言のスコープ(§14.2)は、宣言が現れる残りのブロックであり、独自のイニシャライザ(§14.4)から始まり、ローカル変数宣言ステートメントの右側にさらに宣言子を含めます。

ローカル変数vの名前は、vのスコープ内で直接囲むメソッド、コンストラクター、または初期化子ブロックのローカル変数として再宣言できません。そうでない場合、コンパイル時エラーが発生します。

6
NINCOMPOOP

Java変数スコープについてのすべて。

If variableを外部で使用できるようにするには、外部でstatementを定義する必要があります。

int a = 0;
int b = 0;

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

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

ブロックとステートメント を参照してください

3
Suresh Atta

これはローカル変数であり、{}スコープに制限されています。

これを試してください ここ

2
newuser

ifブロックの外からアクセスできないifブロックの内部でb変数を宣言し、アクセスしたい場合はifブロックの外側に置く

2
shreyansh jogi

Bのスコープは、それが宣言されているブロック、つまり最初のifです。どうしてこんなことに?このスコープルール(レキシカルスコープ)は理解しやすく、実装も簡単で、驚きもほとんどないという原則に従うためです。

Bが2番目に表示されるとすると、

  • コンパイラーは、ブランチの場合は同等のものを推測し、それらを単一のスコープにマージする必要があります(実装が困難)。
  • ランダムなifステートメントの条件を変更すると、一部の変数が表示され、他の変数が非表示になる可能性があります(理解するのが難しく、驚くべきバグの原因になります)。

正気な言語には、このような複雑なスコープルールはありません。

に関して。パフォーマンス-追加の変数を宣言しても、パフォーマンスへの影響はごくわずかです。コンパイラを信頼してください!レジスタを効率的に割り当てます。

2
Alessio Stalla

完全を期すために、これも機能します(説明はスコープです。他の回答を参照してください)

int a = 0;

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

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

スコーピングのため、bはifステートメント内でのみアクセスできます。ここにあるのは実際にはtwo変数であり、それぞれのスコープ内でアクセスできます。

1
kutschkem

{ }は、変数のスコープを定義するために使用されます。ここで宣言しました:

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

したがって、ここではbのスコープは{ }のみになります。したがって、変数bを{ }の外で使用すると、コンパイルエラーが発生します。

これを参照することもできます:

http://docs.Oracle.com/javase/tutorial/Java/javaOO/variables.html

1
Manish Doshi

ブロック内で変数を再宣言すると、変数の制限は、それが宣言された特定のブロックに制限されます。

注:静的変数のみがプログラムのどこからでもアクセスできます。

あなたのコードでは:

int a = 0;

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

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

変数 'a'は、ブロックの外側で宣言されているため、ifステートメントでアクセスできますが、変数 'b'は、ブロックの外側での使用が制限されている場合は、内側で宣言されます。

Ifステートメントの外で「b」を使用する場合は、変数「a」を宣言した場所で宣言する必要があります。

1
Saggy
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ステートメントで使用できなくなるからです。

1
Flipbed

変数bのスコープは、変数を宣言した場所であるifブロックが完了するまでです。そのため、次のブロックではアクセスできません。これはメモリ割り当て用です。それ以外の場合は、メモリ内に浮かぶ変数のALOTになります。

int a = 0;

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

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