#java #if-statement #curly-braces
#java #if-statement #фигурные скобки
Вопрос:
Я начал самостоятельно изучать основы Java несколько месяцев назад (на любительском уровне знаком с PHP
уже несколько лет).
Для практики я использую учебное пособие OCA Java SE 8 Programmer 1 для программистов, и приведен пример экзаменационного вопроса, который меня смущает в отношении использования фигурных скобок и точек с запятой в if-statement
и который я не могу найти в документации Java.
Я не понимаю, почему ответ E разрешен и компилируется.
Я пытался в Netbeans 10 (JDK 11) оценивать предупреждения и подсказки, но это не привело меня к пониманию сути.
Также пытаюсь использовать несколько комбинаций, которые будут компилироваться (только предупреждение о Empty statement
).
if (true) ; {;;{}{}{}} ;;;;;;;;
if (true) ;;{}{{}{}{}}; {;;{}{}{}} ;;;;;;;;
if (true) ;;{}{{}{}{}}; {;;{}{}{}}
Вопрос: Какая из следующих инструкций не будет скомпилирована?
A. if (true) ;
B. if (true) {}
C. if (true) {;}
D. if (true) {;;}
E. if (true) ; {} ;
F. All statements will compile
(= правильный ответ)
Пожалуйста, помогите! Заранее спасибо.
Ответ №1:
Я не понимаю, почему answer
E
разрешен и компилируется.
В Java ;
может быть либо завершителем оператора, либо пустым оператором, в зависимости от контекста.
Вот как анализируется (допустимый) Java-код в option E
:
if (true) // <-- "if" and its condition
; // an empty statement which is the "then" part of the "if"
{} // an (empty) block statement
; // an empty statement
Первые две строки являются завершенным if
выражением. Третья и четвертая строки представляют собой инструкции, следующие за if
инструкцией.
Комментарии:
1. Хорошо, я понял. Третья и четвертая строки не имеют ничего общего с оператором if. Я пробовал в IDE, когда третья и четвертая строки компилируются даже без первых двух строк.
Ответ №2:
Ответ E будет скомпилирован, потому что оператор symbol ;
разрешен в java. В этом случае if
оператор просто имеет пустое тело и не имеет смысла, но он действителен.
Из спецификации java 14.6. Пустой оператор:
Пустой оператор ничего не делает. EmptyStatement:
;
Выполнение пустой инструкции всегда завершается нормально.
{}
Это просто пустой блок кода, который также разрешен в java.
Смотрите спецификацию java 14.2. Блоки