Что на самом деле делает точка с запятой?

#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 оператора). (Извините, если это слишком поздно, я не часто проверяю свой почтовый ящик.)