Какие утверждения допустимы в инкрементаторе 'for loop' в Java? - PullRequest
2 голосов
/ 29 марта 2012

При подготовке к экзамену OCP Java Programmer я был немного удивлен, увидев, что это правильный синтаксис:

for(int i = 0; i < 3; i++, System.out.print("howdy ")) ;

Это заставило меня задуматься! При тестировании некоторых подобных вещей я обнаружил, что это не компилируется:

for(;; int j = 0) ;

Не могу найти много информации об этом. Может ли кто-нибудь предоставить ссылку или объяснить, почему объявление новой переменной в части инкремента не компилируется, а делает другие операторы (вызовы методов и т. Д.)? И это просто (для цикла) объявления переменных или какие-либо другие типы операторов здесь не разрешены?

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Многие операторы верны (см. Ссылку, предоставленную alexei), но вы должны взглянуть на область действия выражений, чтобы понять, почему эта инициализация не будет работать:

Область действия распространяется на все итерации цикла for (а не на новую область действия каждый раз). Первая часть выполняется только один раз, а вторая и третья выполняются в конце каждого цикла. Следовательно, если вы поместите объявление в третью часть, оно будет объявлено несколько раз (что недопустимо).

1 голос
/ 29 марта 2012

Полное объяснение можно найти в Спецификациях языка Java, глава 14.14.1

Выдержка:

BasicForStatement:
    for ( ForInit_opt ; Expression_opt ; ForUpdate_opt ) Statement

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression

Все три «части» являются необязательными иForInit и ForUpdate - это списки выражений, где каждый оператор обозначается запятой.

1 голос
/ 29 марта 2012

Синтаксис цикла for определен в JLS:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14

...