Коли в Java буде використаний нульовий оператор?


10

У підручнику, який я переглядав для класу, зазначено, що вислів може бути порожнім (нульовий вислів). Нульовий вираз визначається як крапка з комою.

Це не робить абсолютно нічого під час виконання. Нульове твердження використовується рідко.

Як досвідчений програміст, мені здається цікавим, що вони кажуть, що рідко використовуються, це означає, що десь є для цього користь.

Яким може бути використання такого твердження?

Відповіді:


7

Це здебільшого марно, але є кілька місць, де це необхідно. Наприклад:

while (DoSomething());

Це виконує DoSomething()метод, поки не поверне значення false. Очевидно, це передбачає, що метод також виконує корисні побічні ефекти. Але порожнє висловлення, тобто кінцева крапка з комою, потрібна, інакше цикл while буде замість цього включати наступне наступне твердження.

(Але для того, щоб суперечити іншим відповідям, for(;;) {}це не приклад порожніх висловлювань, оскільки кругла дужка після фрази не містить висловлювань, вона просто використовує крапку з комою для розділення (необов’язкових) виразів. Детальніше див. У граматиці Java .)


3
+1 - це єдиний раз, коли я коли-небудь бачив, як його реально використовували (як зазначено, порожні розділи оператора "для" дещо відрізняються). Єдина зміна, яку я вніс, - це зазначити, що читати подібний спосіб використання далеко не заплутано, якщо нульове твердження буде залишене у власному рядку, а не одразу після циклу while, де воно просто виглядає як звичайне твердження термінатор ...
Жюль

12

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


Це. Це марна функція мови. Я б швидше був змушений чітко читати дублювання, ніж мати Google "лише крапкою з комою".
Chris Cirefice

2
@ChrisCirefice З іншого боку, "лише крапка з комою: досить очевидно, що слід робити, якщо ви знаєте мову помірно. Це не окреме правило, це лише наслідок інших правил. Плюс, якщо ви дізнаєтесь, як тільки ви дізнаєтесь це назавжди, тому я б сказав, що це насправді не якесь питання
Maurycy

1
Якщо вам здається, що ви хочете писати цикли таким чином, ви щось робите не так.
Басинатор

У мене є метод опитування сну, який я використовую, щоб перевірити, коли пристрій повертається на лінію. Код виглядає приблизно так:, while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }звичайно, все в окремих рядках. Я міг би написати це як while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, але це було б неправильно.
BobDalgleish

Це не нульове твердження, що ми використовуємо також для примусового виходу з методів "void"? void method(){ //code here. If(condition){return ;}}.
Лаїв

9

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

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

Однак з нульовим твердженням напишемо це:

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

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

Це не означає, що немає хороших цілей. Вони просто рідкісні. Зазвичай вони виглядають так:

{
    ;
}

Тому що так виглядає, як ти маєш намір це зробити (навіть цього іноді недостатньо).

У зборі це нульове твердження називається NOP . У Python це називається перепусткою . У java (та інших дітях c) це крапка з комою, як ви сказали, або навіть стверджуєте, що це правда;

Я знаю кілька застосувань:

Семантичний .

Існує різниця між порожнім простором і відведенням нуля як відповідь. Це чітко говорить, ні, я не забув щось тут покласти. Це ніщо не означає нічого. Це явно нічого. Цей простір навмисно залишився порожнім. Ось так ми отримуємо Н / А для компіляції.

Нульова картина

Уявіть собі складну і дорогу машину світлової сигналізації, яка кілька разів підбирала кольорову лампочку з стрічки транспортера, вкручувала її в розетку, включала її, виймала та піднімала наступну. Ви могли контролювати, що ця річ сигналізує за кольором цибулин, які ви надягаєте на пояс. Чудово, тепер, коли він нарешті працює бездоганно, ваш начальник хоче, щоб ви створили спосіб контролювати час цих сигналів. Він хоче додати розрив між повідомленнями. Ви з жахом пам’ятаєте, що багато частин піклуються про час цих сигналів і який біль було синхронізувати їх. Як ви збираєтеся контролювати терміни, не затримуючи вас на роботі у вихідні? Ви подивитеся на відро з випаленими цибулинами і отримаєте, ну не буквально, яскраву ідею.

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

Налагодження

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

Насправді не є предметом Java, але є також:

Бінарне обмацування

Інструкція NOP зі зборів дозволяє зіставити зі складеним бінарним виконуваним файлом. Але сучасні компілятори Java настільки оптимізують, що я не впевнений, що крапка з комою не йде просто. Але за старих часів ми також використовували ці порожні плями у виконуваному файлі, щоб контролювати моменти часу або дозволяти нам пізніше потрапити в гачок. Без НОП там би були фактичні вказівки, тому, якщо ви хочете зачепити його, вам доведеться скопіювати ці інструкції де-небудь ще, щоб звільнити місце для гака. Це добре працює на мові c, з якої Java отримує більшу частину свого синтаксису. Але я не думаю, що ця гачка на гаках трапляється багато на Java. Для цього ми використовуємо орієнтоване на аспекти програмування .


2
Це може здатися педантичним, але приклад із forне нульовими твердженнями. Нульові висловлювання (також порожні висловлювання) можуть відбуватися там же, де можуть виникати інші твердження (як-от if), але наступні дужки forне дозволяють операторам між крапками з комою, а лише ініціалізатором та двома виразами, які не є обов'язковими. Тож це крапка з комою, ніж в якості термінатора. for(;;);
Порожнім

Ви маєте рацію, це здається педантичним: P. Добре, будь ласка, зверніть увагу на мою редакцію.
candied_orange

-7

Я використовую його, тому що Java створена таким чином, що не узгоджується з людською мовою. Те саме стосується С.

Заява є statement;.

Заява if-then-else є if (condition) statement; else statement;

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

Це явно нісенітниця.

Я відповідно пишу, if (condition) {statements} else {statements};що логічно і розумно.

Якщо дизайнери Java хочуть ставитись до цього, ніби до цього, після чого йдеться про нульове твердження, я добре з цим. Якщо це робить їх щасливими, нехай це зробить їх щасливими.


Це if (condition) {statements;} else {statements;}. Крім того, Java досить послідовно не потребує ;після }. На кшталт того, як людські мови часто не дотримуються періоду в кінці речення, який вже закінчується питанням. (Звичайно, є !?або ?!закінчення, але це лише наближення , міжробочий характер .)
8bittree,

1
Солодкий бог !! o_O
Аксель Костас Пена
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.