2013-07-03 5 views
13

Следующий код Java не компилируется.Почему переменные не могут быть объявлены в инструкции if?

int a = 0; 

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

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

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

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

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

+0

потому что б был объявлен в первом случае блок и недоступный из блока, объявить о б с –

+1

Что произошло с вами прав. Ваша переменная b предназначена только для определенных фигурных скобок. – Thihara

+0

Пожалуйста, ознакомьтесь с разъяснением ** WHOLE **. – Aeronth

ответ

10

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

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

26

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

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

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

Только в объеме до конца }.

Поэтому, когда вы пришли к этой линии:

b = 1; 

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

1

Его все о переменной переменной java.

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

int a = 0; 
int b = 0; 

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

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

См Blocks and Statements

1

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

5

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

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

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

2

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

Попробуйте here.

1

{ } используется для определения сферы variables.And здесь вы заявили:

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

Так вот объем б будет только в { } Так вы используете переменную Ь вне { }, он дает ошибку компиляции ,

Вы можете также обратиться так:

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

2

вы объявили б переменную внутри, если блок, который не доступен на стороне вне если блок, и если вы хотите получить доступ затем положить снаружи, если блок

1

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

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

В вас код:

int a = 0; 

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

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

переменная «а» может быть доступна в любой, если заявление, как его заявляют вне блока, но, переменная «Ь» объявить внутри, если, следовательно, ограничивает его использование за пределами блока.

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

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

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

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

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

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

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

+0

У Matlab есть такое правило определения, я боюсь, его адский. (его динамика, и именно поэтому она может справиться с этим безумием в первую очередь). Ах ты сказал «нет ** нормального ** языка», справедливо, я убираю свой комментарий –

+0

Да, я сказал «здравомыслящий»;) Я не знал об этом безумии Матлаба. –

1

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

int a = 0; 

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

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

Благодаря обзорного, б будет доступен только внутри, если заявления. Здесь у нас есть две переменные, каждая из которых доступна только в их объеме.

0

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

int a = 0; 

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

if(a == 1) { 
    b = 1; //compiler error 
} 
Смежные вопросы