Когда в Java будет использоваться нулевое выражение?

10

В учебнике, который я просматривал, указано, что оператор может быть пустым (нулевой оператор). Пустое выражение определяется как точка с запятой.

Это абсолютно ничего не делает во время выполнения. Пустое выражение используется редко.

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

Какая польза от такого заявления?

Bassinator
источник

Ответы:

7

Это в основном бесполезно, но есть несколько мест, где это необходимо. Например:

while (DoSomething());

Это выполняет DoSomething()метод, пока не вернет false. Очевидно, это предполагает, что метод также выполняет некоторые полезные побочные эффекты. Но требуется пустой оператор, то есть завершающая точка с запятой, в противном случае цикл while будет включать следующий следующий оператор.

(Но чтобы противоречить другим ответам, for(;;) {}это не пример пустых операторов, так как скобка после предложения for не содержит операторов, она просто использует точку с запятой для разделения (необязательных) выражений. Подробности см. В грамматике Java .)

JacquesB
источник
3
+1 - это единственный раз, когда я когда-либо видел, чтобы он действительно использовался (как указано, пустые разделы оператора 'for' немного отличаются). Единственное изменение, которое я хотел бы сделать, это указать, что читать этот вид использования гораздо сложнее, если нулевой оператор остается в отдельной строке, а не сразу после цикла while, где он выглядит как обычный оператор. терминатор ...
Жюль
12

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

Карл Билефельдт
источник
Который. Это бесполезная языковая функция. Я бы предпочел явно читать дубликаты, чем Google "только точка с запятой Java".
Крис Cirefice
2
@ChrisCirefice С другой стороны, «только точка с запятой: довольно очевидно, что он должен делать, учитывая, что вы владеете языком умеренно. Это не отдельное правило, это просто следствие других правил. Плюс, если вы изучите его, как только вы знаете его навсегда, так что я бы сказал, что это на самом деле не проблема.
Maurycy
1
Если вы чувствуете, что пишете такие циклы, вы делаете что-то не так.
Басинатор
У меня есть метод опроса, который я использую, чтобы проверить, когда устройство возвращается в рабочее состояние. Код выглядит примерно так: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }все, конечно, на отдельных строках. Я мог бы написать это как while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, но это было бы неправильно.
BobDalgleish
Это не пустое утверждение, что мы используем также для принудительного выхода из «пустых» методов? void method(){ //code here. If(condition){return ;}},
Laiv
9

Я предпочитаю использовать цикл while , но нулевое выражение позволяет вам написать это:

for (;;) { thread.run(); }

Тем не менее, нулевое утверждение позволяет вам написать это:

while(true);
{
    thread.run();
}

Основная цель которого - напрасно тратить время на плохого программиста по обслуживанию, который приходит за вами и задается вопросом, почему поток не работает. Заявление должно следовать некоторое время. Один ; это утверждение. Так что этот блок операторов на самом деле не является частью цикла.

Это не значит, что нет хорошего применения. Они просто редки. Они обычно выглядят так:

{
    ;
}

Потому что таким образом это больше похоже на то, что вы хотите сделать (даже этого иногда недостаточно).

В сборке это нулевое утверждение называется NOP . В Python это называется проход . В Java (и других детей в) это точка с запятой, как вы сказали, или даже утверждение «истина»;

Я знаю несколько вариантов использования:

семантический .

Существует разница между пустым пространством и положением нуля в качестве ответа. Там ясно сказано: нет, я не забыла положить что-то здесь. Это ничто не должно быть ничем. Это явно ничего. Это пространство намеренно оставлено пустым. Вот как мы получаем N / A для компиляции.

Нулевой паттерн

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

Иногда вы хотите использовать полиморфизм, чтобы просто что-то отключить, не нарушая ничего.

Отладка

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

Не совсем Java, но есть также:

Бинарная игра

Инструкция NOP сборки позволяет возиться с скомпилированным двоичным исполняемым файлом. Но современные Java-компиляторы так много оптимизируют, что я не уверен, что точка с запятой не просто испортилась. Но в старые времена мы также использовали эти пустые места в исполняемом файле для контроля времени или для того, чтобы позже мы могли подключиться. Без NOP там были бы реальные инструкции, поэтому, если вы хотите подключить, вам придется скопировать эти инструкции в другое место, чтобы освободить место для подключения. Это работает так же хорошо в языке c, из которого Java получает большую часть своего синтаксиса. Но я не думаю, что эта зацепка часто происходит в Java. Мы используем Аспектно-ориентированное программирование, чтобы сделать это.

candied_orange
источник
2
Это может показаться педантичным, но пример с forне нулевыми утверждениями. Пустые операторы (или пустые операторы) могут появляться в том же месте, где могут встречаться другие операторы (например, an if), но следующие в скобках forзапрещают операторы между точками с запятой, а только инициализатор и два выражения, которые являются необязательными. Таким образом, точка с запятой используется иначе, чем в качестве разделителя символов. Пустое утверждение будет последней точкой с запятой вfor(;;);
JacquesB
Вы правы, это кажется педантичным: P. Хорошо, пожалуйста, обратите внимание на мое редактирование.
candied_orange
-7

Я использую его, потому что Java разработан таким образом, который не соответствует человеческому языку. То же самое относится и к C.

Заявление statement; .

Оператор if-then-else является if (condition) statement; else statement;

Оператор if-then-else с составными блоками if (condition) {statements} else {statements}

Это явно глупость.

Я соответственно пишу if (condition) {statements} else {statements}; что логично и разумно.

Если дизайнеры Java хотят рассматривать это как if-then-else с последующим нулевым оператором, я в порядке. Если это делает их счастливыми, пусть это делает их счастливыми.

Мартин Кочански
источник
Это if (condition) {statements;} else {statements;}. Кроме того, Java довольно последовательна в том, что не нужно ;s после }. Вроде того, как человеческие языки не часто ставят точку в конце предложения, которое уже заканчивается знаком вопроса. (Конечно, есть !?или ?!окончания, но это только приближения , символ
межбанда
1
Сладкий бог !! о_О
Аксель Костас Pena