#java
#java
Вопрос:
Я смотрел на типичный цикл for:
class ForDemo {
public static void main(String[] args){
for(int i=1; i<11; i ){
System.out.println("Count is: " i);
}
}
}
Я доволен точкой с запятой после int i=1
: это оператор , который объявляет новую переменную i
. Если i
это тоже утверждение, то почему после него нет точки с запятой?
Другой пример. Я открыл Jshell и поместил следующее:
jshell> int a=1;
a ==> 1
jshell> a
$2 ==> 1
jshell> a
a ==> 2
jshell> int b=1;
b ==> 1
jshell> b ;
$5 ==> 1
jshell> b
b ==> 2
Другими словами, команда
работает независимо от того, есть точка с запятой или нет. Я ожидал, что без нее не получится.
Последний пример (адаптирован из презентации о разнице между =
и ==
):
jshell> boolean x = false;
x ==> false
jshell> if (x = true) System.out.println("Sorry! This is wrong ...");
Sorry! This is wrong ...
jshell> boolean x = false;
x ==> false
jshell> if (x = true;) System.out.println("Sorry! This is wrong ...");
| Error:
| ')' expected
| if (x = true;) System.out.println("Sorry! This is wrong ...");
| ^
Я понимаю, в чем разница между = и ==. Мой вопрос в том, почему он работает в первой половине ( if (x = true)
без ;
), а не с a ;
( if (x = true;)
) .
Извиняюсь за несколько примеров, но я думаю, что вопрос относительно прост: если есть случаи, когда выражение (без ;
) работает как оператор команды (с ;
), какова функция точек с запятой?
Комментарии:
1. «Если i — это тоже оператор, почему после него нет точки с запятой?» — i — это выражение, которое может быть оператором, но в объявлении цикла for оно не является оператором. Я бы настоятельно посоветовал вам игнорировать аспект jshell — в принципе, jshell может иметь свои собственные правила; сосредоточьтесь на правилах языка Java.
2. Точка с запятой ничего не делает. Он используется только для разделения выражений и операторов. Это просто часть синтаксиса языка. JShell интерпретирует код немного иначе, чем компилятор Java, он не всегда требует точки с запятой.
3. Точка с запятой не имеет семантического значения, она просто используется в конце инструкций в Java. Это как точка в английском языке — мы пишем ее в конце предложения, без нее предложение имело бы тот же смысл, без нее предложение просто синтаксически неправильно.
Ответ №1:
Точка с запятой ничего не делает, она существует, потому for
что цикл (среди прочего) определяется как
BasicForStatement: оператор for ( ForInitopt ; Expressionopt ; ForUpdateopt )
согласно https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html
По определению между тремя частями есть две точки с запятой.
Ответ №2:
Точка с запятой — это разделитель вызовов стека. Внутри if()
требуется логическое значение, а не вызов стека. Ожидается только внутри {}
операторов are.
Внутренняя часть for()
ожидает три вызова стека: один определяет переменную цикла, один определяет разделяющее предложение и один определяет, что происходит после каждого цикла.
Пример: конструкция for(;;);
является допустимой конструкцией Java. Но вы никогда не должны использовать его, так как единственное, что он будет делать, — это бесконечно повторять ничто: вы не определяете переменную, условие прерывания или что-то, что выполняется после каждого вызова. Во время цикла вы также просто ничего не делаете.
Комментарии:
1. Я понимаю, почему for(;;); допустимо. У меня другой вопрос: почему никто не пишет для(;;;) (т. Е. с дополнительной точкой с запятой)
2. Потому что «;» — это РАЗДЕЛИТЕЛЬ операторов. Если бы вы написали for(;;;) , вы бы фактически определили четыре пустых оператора, чего не ожидает цикл for (3 оператора). (Извините, если это слишком поздно, я не часто проверяю свой почтовый ящик.)