Ошибка компилятора при объявлении переменной внутри условия if и без фигурных скобок
почему это "первый"!--1--> компиляция хорошо и второй сбой?
if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)
5 ответов:
потому что спецификация языка говорит так:
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, а неStatement. Так что это не работает.
Это потому, что это не было бы полезным кодом. Если у вас есть оператор if без фигурных скобок ({}), выполняется только первая строка / оператор после 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
Если (продолжить) int i;
Если мы используем
ifоператор без фигурных скобок он будет выполнять только первую строку сifдля условной манере. Остальные строки будут выполняться нормально.это ошибка компиляции, потому что объявление локальной переменной происходит с условным образом, и компилятор предполагает, что он недоступен с помощью ложного оператора.
Если вы используете фигурные скобки, то объявление переменной и использование локальной переменной внутри блока и следовательно, компилятор предполагает, что это достижимый код. Тогда нет ошибок компилятора.