2013-10-13 7 views
2

Я выполнил некоторые поиски и не смог найти список допустимых типов, которые будут использоваться в операторах инициализации цикла. Есть ли фиксированный список типов, которые могут использоваться в объявлениях переменных цикла for? Например, рассмотрим следующий код:Типы разрешены для объявлений переменных цикла?

for (int i = 0; i < 5; i++) // ... 
for (String str = "a"; str.length() < 10; str+="a") // ... 

Первые работы, но я не думаю, что вторая будет. Есть ли список всех типов, разрешенных в инициализации цикла for?

+3

Пытались ли вы второй? Вы можете использовать любой тип, который вам нужен, ограничений нет .. вы даже можете инициализировать несколько переменных, если они все одинаковы. –

+0

О, ничего себе, мне сказал мой лектор, что существуют ограничения на типы для петель ... не утруждал себя испытанием. Извините – user912

+1

А, ну, ваш лектор должен взглянуть на [выражение 'for'] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls- 14.14) в спецификации языка Java. :) Существуют ограничения на то, что может быть там; либо несколько операторов, разделенных запятыми, либо объявление одной или нескольких переменных, а выражение условия должно быть логическим, но нет ограничений на типы переменных, которые могут быть объявлены. –

ответ

4

Изучите спецификацию языка Java для the for statement. Вы можете объявить и инициализировать любой тип переменной в цикле for и даже объявить несколько переменных, если они все одинаковы. Соответствующие правила в грамматике являются:

BasicForStatement: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement 

ForInit: 
    StatementExpressionList 
    LocalVariableDeclaration 

LocalVariableDeclaration: 
    VariableModifiersopt Type VariableDeclarators 

VariableDeclarators: 
    VariableDeclarator 
    VariableDeclarators , VariableDeclarator 

Это означает, что вы можете сделать одно из следующих действий, например,

for (; … ; …)       // no variable declaration at all 
for (int i; … ; …)     // variable declaration with no initial value 
for (int i=0; … ; …)     // variable declaration with initial value 
for (int i=0, j=1; … ; …)    // multiple variables 
for (final Iterator<T> it = …; … ; …) // final variable 

Первый пример здесь показывает, что вам не нужны никакие переменные вообще , и как pointed out in the comments, вам не обязательно иметь ForUpdate. Единственное ограничение состоит в том, что у вас должно быть выражение в середине, и оно должно быть логически выраженным выражением.

Как и в стороне, ForInit также может быть StatementExpressionList, что означает, что вместо объявления и инициализации переменных вы также можете просто выполнить некоторые инструкции. Например, вы могли бы это сделать (но это не является особенно полезным пример):

for (System.out.println("beginning loop" ; … ; …) 

Это может быть полезным, я полагаю, в моделировании do/while цикла (если вы хотите, чтобы сделать это), если корпус - это простая функция:

for (method() ; condition ; method()); 
+0

Пока он работает над этим; короткий ответ заключается в том, что средний ('Expressionopt') должен оцениваться в' boolean' или 'Boolean', но таких ограничений для типов для двух других частей нет. –

+0

@ DennisMeng Это хороший момент. Я не думаю, что это именно то, о чем спрашивает ОП, но это хороший момент. Остальные две части даже не должны присутствовать! –

+0

В частности, 'for (; true;);' должно быть действительным. –

1

Второй также будет работать нормально. Вы можете использовать любой тип для цикла

for(String str="a";str.length()<10;str+="a") 
    { 
     System.out.println(str); 
    } 

Я просто попытался для сценария и результат

a 
aa 
aaa 
aaaa 
aaaaa 
aaaaaa 
aaaaaaa 
aaaaaaaa 
aaaaaaaaa 
Смежные вопросы