25

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

int a = 0;

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

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

なんで?b最初に宣言せずに1 を代入するプログラムにつながるコード パスは存在しません。

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

(2 番目のステートメントで単純に b を宣言することができないと主張したいif場合があります。その場合は、別の場所でループに入る可能性があると想像してください。)

4

13 に答える 13

33

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

ここで b を宣言すると:

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

あくまでも最後までの範囲}です。

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

b = 1;

b存在しません。

于 2013-07-03T09:13:29.113 に答える
12

なんで?最初に宣言せずに b に 1 を代入するプログラムにつながるコード パスは存在しません。

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

于 2013-07-03T11:11:21.850 に答える
6

これにより{ }、ブロック スコープが定義されます。間に宣言され{}たものはすべて、そのブロックに対してローカルです。つまり、ブロックの外では使用できません。ただし、Java では、内側の名前で外側のブロックの名前を隠すことはできません。これはJLSが言うことです:

ブロック内のローカル変数宣言のスコープ (§14.2) は、宣言が表示されるブロックの残りの部分であり、独自の初期化子 (§14.4) から始まり、ローカル変数宣言ステートメントの右側にさらに宣言子があればそれを含みます。

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

于 2013-07-03T09:14:29.777 に答える
3

そのすべてはJava変数のスコープに関するものです。

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

int a = 0;
int b = 0;

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

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

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

于 2013-07-03T09:14:00.267 に答える
2

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

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

于 2013-07-03T09:16:43.217 に答える
2

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

于 2013-07-03T09:17:35.953 に答える
1

b が最初の if (a == 1) で範囲外になると、削除されてスタックに存在しなくなるため、次の if ステートメントでは使用できません。

于 2013-07-03T09:14:04.640 に答える
1

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

注 : プログラムのどこからでもアクセスできるのは、静的変数だけです。

あなたのコードで:

int a = 0;

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

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

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

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

于 2013-07-03T09:21:29.413 に答える
1

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

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

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

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

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

于 2013-07-03T09:17:14.623 に答える
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
}

エラーを修正するには、次の方法を実行する必要があります

    int a = 0;
    int b = 0;
    if(a == 1) {
       b=0;
    }
    if(a == 1) {
        b = 1;
    }
于 2013-07-03T09:22:53.397 に答える
1

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

int a = 0;

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

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

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

于 2013-07-03T09:42:45.910 に答える
0

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

int a = 0;

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

if(a == 1) {
    b = 1; //compiler error
}
于 2013-07-04T09:20:47.553 に答える