Подтвердить что ты не робот

Ошибка компилятора при объявлении переменной внутри условия if и фигурных скобок

Почему этот первый if компилируется, а второй не удается?

if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Из Java Language Spec.

    Block:
            { BlockStatementsopt }

    BlockStatements:
            BlockStatement
            BlockStatements BlockStatement

    BlockStatement:
            LocalVariableDeclarationStatement
            ClassDeclaration
            Statement

и

    IfThenStatement:
            if ( Expression ) Statement

Кажется, что int i является LocalVariableDeclarationStatement, а не a Statement. Так что это не работает.

Ответ 3

Это потому, что это не был бы полезный код. Если у вас есть оператор 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

Ответ 4

if (continue) int i;

Если мы используем инструкцию if без фигурных скобок, она будет выполнять только первую строку с if для условного способа. Другие строки будут выполняться в обычном режиме.

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

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

Ответ 5

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

В С++ это разрешено, но Java не разрешает это