2015-05-12 4 views
0

Рассмотрим следующий Java-код:Java цикл через целочисленный массив

int[] array = {1, 2, 3, 4, 5, 6}; 
for(int i : array) { 
    System.out.print(i + " "); 
} 

Приведенный выше код, очевидно, выводит содержимое массива.

1 2 3 4 5

Мой вопрос: почему Java не разрешает это?

int[] array = {1, 2, 3, 4, 5, 6}; 
int i; 
for(i : array) { 
    System.out.print(i + " "); 
} 

EDIT: при компиляции 2-й программы, я получаю следующее сообщение об ошибке:

Main.java:14: error: bad initializer for for-loop 
     for(i : array) { 
      ^
1 error 
+0

Какая ошибка вы получаете? – GiantTree

+0

@ RüdigerHerrmann: В этой статье совсем не рассматривается его проблема - она ​​охватывает только интерфейс «Итерабельный», в частности, забывая «реализует» его. [Java 1.5.0 «Для каждой петли» docs] (http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html), ссылки на нее также не упоминаются , хотя все их примеры соответствуют его первой версии, они не исключают его второго. –

ответ

7

Поскольку Java заставляет вас объявить переменную здесь. JLS, Section 14.14.2, определяет повышенную for цикл с синтаксисом:

EnhancedForStatement:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) Statement 

EnhancedForStatementNoShortIf:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) StatementNoShortIf 

UnannType представляет собой тип переменной объявляется.

Это говорится о том, что такой усовершенствованный цикл является эквивалентом этого, для цикла по Iterable с ...

for (I #i = Expression.iterator(); #i.hasNext();) { 
    {VariableModifier} TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 

... и для массивов ...

T[] #a = Expression; 
L1: L2: ... Lm: 
for (int #i = 0; #i < #a.length; #i++) { 
    {VariableModifier} TargetType Identifier = #a[#i]; 
    Statement 
} 

Ясно, что переменная является локально объявленной переменной внутри цикла.

+0

Понял. Спасибо @rgettman –

0

Что показывает ошибка? Возможно, вы должны инициализировать разновидность:

int i = 0; 
+0

Примитивы инициализируются автоматически с помощью «0». Цикл 'for' также меняет значение этого' int' сразу, поэтому инициализация этой переменной ничего не меняет. – GiantTree

+0

Итак, Какова ошибка? – bugs2919

+2

@GiantTree нет, локальные переменные автоматически не инициализируются. Но да, это не имеет значения. – Tom

0

Вы используете «Расширенные» для петель. Это функция, доступная после Java 1.5. Синтаксис расширенного цикла для цикла равен

for(Object obj : List) { 
    ... 
} 

Если вы пишете в другом формате, это вызовет ошибку компиляции. В основном код, который вы написали, синтаксически неверен. Это будет ошибка компиляции.

Вы можете обратиться What is the syntax of enhanced for loop in Java?

+0

Я понимаю это. Я просто пытаюсь понять обоснование синтаксиса. –

+0

Его синтаксис.Это так. иначе как Java узнает, что для данного списка желаемый объект –

Смежные вопросы