Ошибка компилятора при объявлении переменной внутри условия 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 58

5 ответов:

потому что спецификация языка говорит так:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

объявление вводит объект в программу и включает идентификатор (§3.8), который может использоваться в имени для ссылки на этот объект. Объявленный объект является одним из следующих:
...
Локальная переменная, одна из следующих:
* Локальная переменная, объявленная в блоке (§14.4)
* Локальная переменная объявлено в заявлении for (§14.14)

ваш первый пример-объявление i внутри блока (обозначается фигурными скобками). Ваш второй не является, и это не for заявление.

редактировать, чтобы добавить: что просто делает здравый смысл. Если бы это было разрешено, это было бы бесполезно. Он сразу же выпадет из поля зрения.

С Спецификация Языка Java.

    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 для условной манере. Остальные строки будут выполняться нормально.

это ошибка компиляции, потому что объявление локальной переменной происходит с условным образом, и компилятор предполагает, что он недоступен с помощью ложного оператора.

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

Как и в Java / C++, если мы пишем, если без фигурных скобок, выполняется только 1-й оператор В этом случае переменная i бесполезна. Вы объявляете его в операторе if и его область заканчивается после этого оператора, что бесполезно

В C++ , это разрешено ,но Java не позволяет этого