Почему переменные не могут быть объявлены в операторе if?
следующий код Java не компилируется.
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
b = 1;
}
почему? Не может быть пути кода, ведущего к программе, присваивающей 1 b
не объявив ее.
мне пришло в голову, что может быть ограничена первым if
заявление, но тогда я не понимаю, почему. Что делать, если я действительно не хочу объявлять b
без необходимости, чтобы улучшить производительность? Мне не нравится, когда переменные остаются неиспользуемыми после декларация.
(вы можете поспорить, чем я мог бы просто объявить b во втором if
заявление, в таком случае, просто представьте, что оно может быть в цикле где-то еще.)
13 ответов
почему? Не может быть никакого пути кода, ведущего к программе, назначающей 1 в b без объявления его первым.
вы правы, но компилятор этого не знает. Компилятор не выполняет код. Компилятор переводит только байт-код без оценки выражений.
переменные могут быть объявлены внутри условного оператора. Однако вы пытаетесь получить доступ b
в другой области.
когда вы объявляете b здесь:
if(a == 1) {
int b = 0;
}
это только в области до конца }
.
поэтому, когда вы подходите к этой строке:
b = 1;
b
не существует.
этой { }
определяет область действия блока. Все, что объявлено между {}
локальная для этого блока. Это означает, что вы не можете использовать их вне блока. Однако Java запрещает скрывать имя во внешнем блоке именем во внутреннем. Это JLS говорит :
область объявления локальной переменной в блоке (§14.2) - это остальная часть блока, в котором появляется объявление, начиная с его собственного инициализатора (§14.4) и включая любой далее деклараторы справа в операторе объявления локальной переменной.
имя локальной переменной v не может быть объявлено как локальная переменная непосредственно заключающего метода, конструктора или блока инициализатора в области v, или возникает ошибка времени компиляции.
его все о области видимости переменных java.
вам нужно будет определить variable
вне if statement
чтобы иметь возможность использовать его снаружи.
int a = 0;
int b = 0;
if(a == 1) {
b = 1;
}
if(a == 1) {
b = 2;
}
посмотреть блоки и заявления
это локальная переменная и ограничена областью {}.
попробуй такое здесь.
вы объявили переменную b внутри блока if, который недоступен снаружи блока if, и если вы хотите получить доступ, то поместите снаружи, если блок
область b-это блок, в котором он объявлен, то есть первый if. Почему это так? Потому что это правило (лексическое) легко понять, легко реализовать и следует принципу наименьшего удивления.
Если бы b было видно во втором if:
- компилятор должен был бы вывести эквивалент, если ветви и объединить их в одну область (трудно реализовать);
- изменение условия в случайном операторе if потенциально сделать некоторые переменные видимыми, а другие скрытыми (трудно понять и источник удивительных ошибок).
ни один здравомыслящий язык не имеет такого сложного правила определения области.
w.r.т. производительность-объявление дополнительной переменной оказывает незначительное влияние на производительность. Доверьтесь компилятору! Он будет эффективно распределять регистры.
потому что, когда b выходит из области видимости в первом if (a == 1), то он будет удален и больше не существует в стеке и, следовательно, не может использоваться в следующем if оператор.
{ }
используется для определения области действия переменных.И тут вы заявили:
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 " объявляется внутри, если, следовательно, ограничено ее использование вне блока.
Если вы хотите использовать 'B' вне оператора if вы должны объявить его там, где у вас есть переменная declare '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;
}
просто для полноты: это тоже работает (объяснение является областью, см. другие ответы)
int a = 0;
if(a == 1) {
int b = 0;
}
if(a == 1) {
int b = 1;
}
из-за области видимости b будет доступен только внутри операторов if. То, что мы имеем здесь на самом деле два переменные, каждая из которых доступна только в своей области.
область действия переменной b только до завершения блока if, так как именно здесь вы объявили переменную. Именно поэтому к нему нельзя получить доступ в следующем блоке. Это для выделения памяти, иначе они были бы множеством переменных, плавающих в памяти.
int a = 0;
if(a == 1) {
int b = 0;
} //b scope ends here
if(a == 1) {
b = 1; //compiler error
}