Почему этот первый if
компилируется, а второй не удается?
if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)
Почему этот первый if
компилируется, а второй не удается?
if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)
Потому что спецификация языка говорит так:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html
Объявление вводит сущность в программу и включает в себя идентификатор (§3.8), который может использоваться в имени для ссылки на этот объект. Объявленный объект является одним из следующих:
...
Локальная переменная, одна из следующих:
* Локальная переменная, объявленная в блоке (§14.4)
* Локальная переменная, объявленная в инструкции for (§14.14)
Ваш первый пример - объявление i
внутри блока (обозначается фигурной скобкой). Ваша вторая - нет, и это не утверждение for
.
Отредактировано для добавления:. Если бы это было разрешено, это было бы бесполезно. Это немедленно выйдет из сферы действия.
Block: { BlockStatementsopt } BlockStatements: BlockStatement BlockStatements BlockStatement BlockStatement: LocalVariableDeclarationStatement ClassDeclaration Statement
и
IfThenStatement: if ( Expression ) Statement
Кажется, что int i
является LocalVariableDeclarationStatement
, а не a Statement
. Так что это не работает.
Это потому, что это не был бы полезный код. Если у вас есть оператор if без фигурных скобок ({}), выполняется только первая строка /statement после if. Поэтому, если вы объявляете только локальную переменную, ее нельзя использовать нигде. Так что объявление абсолютно бесполезно.
if(proceed){
int i= 0;
// variable i can be used here
//...
}
if (proceed) int i; // i can not be used anywhere as it is a local variable
if (continue) int i;
Если мы используем инструкцию if
без фигурных скобок, она будет выполнять только первую строку с if
для условного способа. Другие строки будут выполняться в обычном режиме.
Это ошибка компиляции, потому что объявление локальной переменной происходит с условным образом и компилятор предполагает, что он не доступен с ложным утверждением.
Если вы используете фигурные скобки, то объявление переменной и использование локальной переменной в блоке и, следовательно, компилятор предполагают, что это доступный код. Тогда нет ошибок компилятора.
Как и в Java/С++, если мы пишем if без фигурных скобок, выполняется только 1-й оператор В этом случае переменная я бесполезна. Вы объявляете его в выражении if и его область действия заканчивается после этого утверждения, что бесполезно
В С++ это разрешено, но Java не разрешает это