Почему переменные не могут быть объявлены в инструкции if? - программирование

Почему переменные не могут быть объявлены в инструкции if?

Следующий код Java не компилируется.

int a = 0;

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

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

Почему? Не может быть никакого кодового пути, ведущего к тому, что программа назначает 1 на b, не объявляя ее в первую очередь.

Мне пришло в голову, что область видимости переменной b может быть ограничена первым оператором if, но тогда я бы не понял почему. Что делать, если я действительно не хочу объявлять b без необходимости, чтобы повысить производительность? Мне не нравится, что переменные остаются неиспользованными после объявления.

(Возможно, вы захотите спорить, иначе я могу просто объявить b во втором выражении if, в этом случае просто представьте, что он может быть в петле в другом месте.)

4b9b3361

Ответ 1

Почему? Не может быть никакого кодового пути, ведущего к тому, что программа назначает от 1 до b, не объявляя сначала.

Вы правы, но компилятор этого не знает. Компилятор не выполняет код. Компилятор переводит только байт-код без оценки выражений.

Ответ 2

Переменные могут быть объявлены внутри условного оператора. Однако вы пытаетесь получить доступ к b в другой области.

Когда вы объявляете b здесь:

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

Это только в области до конца }.

Поэтому, когда вы приходите к этой строке:

b = 1;

b не существует.

Ответ 3

Этот { } определяет область блока. Все, что объявлено между {}, является локальным для этого блока. Это означает, что вы не можете использовать их вне блока. Однако Java запрещает скрывать имя во внешнем блоке по имени во внутреннем. Это то, что JLS говорит:

Объем объявления локальной переменной в блоке (§14.2) - это остальная часть блока, в котором появляется объявление, начиная с его собственного инициализатора (§14.4) и включая любые другие деклараторы справа в локальной переменной декларации.

Имя локальной переменной v не может быть переопределено как локальная переменная непосредственно вложенного метода, блока конструктора или инициализатора в пределах области v или возникает ошибка времени компиляции.

Ответ 4

Это локальная переменная и ограничена областью {}.

Попробуйте здесь.

Ответ 5

вы указали b переменную внутри, если блок, который не доступен вне блока if, и если вы хотите получить доступ, тогда поставьте внешний, если блок

Ответ 6

Область действия b - это блок, который он объявлен, то есть первый, если. Почему это так? Поскольку это правило определения (лексическое определение) легко понять, легко реализуется и следует принципу наименьшего удивления.

Если b должно быть видимым во втором, если:

  • компилятор должен был бы вывести эквивалент, если ветки и объединить их в одну область (трудно реализовать);
  • изменение условия в случайном выражении if потенциально может сделать некоторые переменные видимыми, а другие скрыты (трудно понять и источник удивительных ошибок).

Отсутствие разумного языка имеет такое сложное правило охвата.

w.r.t. производительность - объявление дополнительной переменной оказывает незначительное влияние на производительность. Доверяйте компилятору! Он будет эффективно распределять регистры.

Ответ 7

Все о области видимости переменной java.

Вам нужно будет определить variable вне if, если statement, чтобы использовать его снаружи.

int a = 0;
int b = 0;

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

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

Смотрите Блоки и заявления

Ответ 8

Потому что, когда b выходит из области видимости в первом, если (a == 1), то он будет удален и больше не будет существовать в стеке и поэтому не может использоваться в следующем операторе if.

Ответ 9

{ } используется для определения области переменных. И здесь вы объявили:

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

Итак, здесь область b будет только в { }. Поэтому вы используете переменную b вне { }, она дает ошибку компиляции.

Вы также можете ссылаться на это:

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

Ответ 10

Если вы повторно объявляете переменную внутри блока, тогда ограничение переменной ограничивается конкретным блоком, в котором оно было объявлено.

ПРИМЕЧАНИЕ. Только статические переменные имеют доступ из любой точки программы.

В вашем коде:

int a = 0;

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

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

переменная 'a' может быть доступна в любом операторе if, поскольку она объявляется вне блока, но переменная 'b' объявляется внутри, следовательно, ограничивает ее использование вне блока.

Если вы хотите использовать 'b' вне оператора if, вы должны объявить его там, где вы указали переменную 'a'.

Ответ 11

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;
    }

Ответ 12

Просто для полноты: этот работает также (пояснение поясняется, см. другие ответы)

int a = 0;

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

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

Из-за видимости, b будет доступен только внутри операторов if. Здесь у нас есть фактически две переменные, каждая из которых доступна только в своей области.

Ответ 13

переменная b scope только до тех пор, пока блок if не завершится, так как здесь вы объявили переменную. Вот почему он не может быть доступен в следующем блоке. Это относится к распределению памяти, иначе они будут ALOT переменных, плавающих в памяти.

int a = 0;

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

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