2016-12-06 22 views
3

А.окончательного ключевого слова в условии секции для цикла

int a=10,b=20; 
    for(int i=0;a>b;i++) 
    { 
     System.out.print("aa"); 
    } 
    System.out.print("bb"); 

Б.

final int a=10,b=20; 
    for(int i=0;a>b;i++) 
    { 
     System.out.print("aa"); 
    } 
    System.out.print("bb"); 

Вопрос, почему с кодом А печатает на выходе «ВВ», а код Б возвращает ошибку «недостижимый код» ?

+2

Конечные переменные никогда не могут быть изменены во время выполнения, но могут использоваться обычные переменные. так что в ** A ** там можно достичь внутренней петли для петли, но в ** B ** ее никогда не возможно – XtremeBaumer

+0

Чтобы уточнить, в ** A ** теоретически * возможно, чтобы он мог войти цикл, если между ними был некоторый дополнительный код. Другими словами, компилятор не будет пытаться угадать поток, если это действительно очевидно. – shmosel

+0

@ XtremeBaumer И A, и B конечные переменные не изменяются. –

ответ

2
final int a=10,b=20; 

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

поэтому этот цикл

for(int i=0;a>b;i++) 

имеет никогда не нарушая условие (а> Ь никогда не будет истинным), поэтому цикл навсегда, и это становится

System.out.print("bb"); 

«unreachab le code "

1

В разделе Код можно изменить, как показано ниже, и распечатать оба выхода. Обратите внимание, что во время выполнения в цикле можно изменить значение на a и b. и выход будет aabb

int a=10,b=20; 
    for(a=30;a>b;) 
    { 
     System.out.print("aa"); 
     a=a-20; 
    } 
    System.out.print("bb"); 

В разделе В на время выполнения, это не возможно изменить значение а или Ь, так как те, окончательные переменные. По этой причине JVM может определить, что нет возможности получить статус a>b. (Так как a> b всегда false).

Так что JVM будет бросать ошибку компиляции, говоря о недостижимом коде.

1

окончательное ключевое слово говорит, что значения a и b не могут быть изменены, то есть они являются значениями, а не переменными, и поэтому для цикла никогда не будет выполняться внутренний оператор, поэтому компилятор выводит, что код внутри цикла не доступен.

+0

в коде B, попробуйте следующее: final int a = 10, b = 20; a = 25; это даст ошибку компиляции. Таким образом, это означает, что a и b являются неизменными. –

1

B возвращает ошибку "код недостижим"

for(int i=0;a>b;i++) //with final modifier, `a` & `b` are constants 

Как компилятор видит ваш код с окончательным модификатором, это компилятор жалуется

for(int i=0;10>20;i++) 

10 будет всегда меньше 20, поэтому ваше бо dy петли в unreachable code