Циклы while и do-while в Kotlin с примерами кода
Циклы являются способом многократного выполнения кода в Kotlin. В этом уроке мы познакомимся с одним из типов циклов, а именно — циклом while
.
Содержание статьи
- Цикл while в Kotlin
- Цикл do-while в Kotlin
- Прерывание цикла с помощью break в Kotlin
- Задачи для проверки
Если вы уже изучали другие языки программирования, вам будут знакомы концепции и, возможно, даже синтаксис.
Цикл while в Kotlin
Цикл while
повторяет блок кода, пока выполняется условие. Цикл while в Kotlin создается следующим образом:
while (<CONDITION>) { <LOOP CODE> }
while (<CONDITION>) { <LOOP CODE> } |
Цикл проверяет условие для каждой итерации. Если условие истинно (true), цикл выполняется и переходит к другой итерации.
Если условие ложно (false), цикл останавливается. Как и выражения if, циклы while создает свою собственную область видимости.
Простейший цикл while
имеет следующую форму:
while (true) { }
while (true) {
} |
Это вечный цикл while в Kotlin, так как условие всегда истинно (true). Конечно, вам вряд ли потребуется писать такой
Далее представлен более полезные пример цикла while в Котлин:
var sum = 1 while (sum < 1000) { sum = sum + (sum + 1) }
var sum = 1
while (sum < 1000) { sum = sum + (sum + 1) } |
Данный код подсчитывает математическую последовательность до того момента, где значение больше 1000
.
Цикл выполняется следующим образом:
- Перед итерацией 1:
sum
= 1, условие цикла = true - После итерации 1:
sum
= 3, условие цикла = true - После итерации 2:
sum
= 7, условие цикла = true - После итерации 3:
sum
= 15, условие цикла = true - После итерации 4:
sum
= 31, условие цикла = true - После итерации 5:
sum
= 63, условие цикла = true - После итерации 6:
sum
= 127, условие цикла = true - После итерации 7:
sum
= 255, условие цикла = true - После итерации 8:
sum
= 511, условие цикла = true - После итерации 9:
= 1023, условие цикла = false
После девятой итерации переменная sum
равна 1023
, следовательно, условие sum < 1000
становится ложным (false). В данной точке — цикл останавливается.
Цикл do-while в Kotlin
Одним из вариантов цикла while
является цикл do-while. Он отличается от цикла while
тем, что условие проверяется в конце цикла, а не в начале. Это означает, что хотя бы 1 раз тело цикла будет выполнено.
do { <LOOP CODE> } while (<CONDITION>)
do { <LOOP CODE> } while (<CONDITION>) |
Далее дан пример из прошлого раздела, только здесь используется цикл do-while
:
sum = 1 do { sum = sum + (sum + 1) } while (sum < 1000)
sum = 1
do { sum = sum + (sum + 1) } while (sum < 1000) |
В данном примере вывод такой же, как и раньше. Однако, так бывает не всегда. Вы можете получить другой результат с другим условием. Рассмотрим следующий цикл
:
sum = 1 while (sum < 1) { sum = sum + (sum + 1) }
sum = 1
while (sum < 1) { sum = sum + (sum + 1) } |
Рассмотрим аналогичный цикл do-while
, который использует такое же условие:
sum = 1 do { sum = sum + (sum + 1) } while (sum < 1)
sum = 1
do { sum = sum + (sum + 1) } while (sum < 1) |
В случае обычного цикла while
условие sum < 1
является ложным с самого начала.
sum
будет равна 1
, потому что цикл не будет выполнять никаких итераций. В случае цикла do-while
сумма sum
будет равна 3
, потому что цикл do-while ВСЕГДА выполнится хотя бы один раз, даже если изначально условие ложное.Прерывание цикла с помощью break в Kotlin
Иногда требуется прервать цикл раньше времени. Для этого можно использовать оператор break
, который сразу прерывает цикл и продолжает выполнение кода после него.
К примеру, рассмотрим следующий код:
sum = 1 while (true) { sum = sum + (sum + 1) if (sum >= 1000) { break } }
1 2 3 4 5 6 7 8 | sum = 1
while (true) { sum = sum + (sum + 1) if (sum >= 1000) { break } } |
Здесь условие цикла истинно (true), поэтому цикл будет повторятся бесконечно. Однако оператор break указывает на то, что цикл while
завершится, когда сумма будет больше или равна 1000
.
Мы узнали, как написать один и тот же цикл по-разному, и тем самым продемонстрировали, что в программировании бывает много способов добиться одного и того же результата разными способами.
Вам следует выбирать наиболее удобные в зависимости от ситуации. Это подход, который вы усвоите со временем и практикой.
Задачи для проверки
1. Создайте переменную counter
, значением которой будет 0
. Создайте цикл while с условием counter < 10
, который выводит counter равен X
(где Х
заменяется значением counter
) и затем увеличивает counter
на 1
;
2. Создайте переменную counter
со значением 0
. Создайте другую переменную под названием roll
, значением которой будет 0
. Создайте цикл do-while
.
Внутри цикла укажите, что переменная roll
равна Random().nextInt(6)
, то есть выбор случайного числа между 0
и 5
. Затем увеличьте counter
на 1
.
Под конец выведите После X бросков, roll равен Y
, где Х
является значением counter
, а Y
— значением roll
. Укажите условие цикла, при котором цикл будет заканчиваться при выпаде первого 0
.
Решения задач
[crayon-6453518ca1161818661611/]
Будет ли выполнен код, если он находится после непрерывного бесконечного цикла в JavaScript?
- Автор темы pagas48
- Дата начала
pagas48
pagas48
- #1
Нет?
Или ->
Да, если цикл выполняется слишком долго, он прервется, после чего программа продолжит выполнение?
Или же ->
Да, после определенного максимального количества итераций, будет осуществлен выход из цикла и программа продолжит выполнение?
Скажите пожалуйста!
Сортировка по дате Сортировка по голосам
diviniti
diviniti
- #2
код выполнен не будет, однако есть «но», если необходимы бесконечные циклы есть «но», которое позволит это делать, но явка уже будет как вспомогательная
Позитивный голос 0
alberdt
alberdt
- #3
По идее нет, ошибка выскочит поскольку память будет переполнена
Позитивный голос 0
Владимир12345
Владимир12345
- #4
При бесконечном цикле файрфокс выведет сообщение что бла-бла-бла, сценарий занят и не отвечает, остановить сценарий? Типа так
Позитивный голос 0
Makasin26
Makasin26
- #5
какой бесконечный цикл — есть таймеры Setinterval и Settimeout
Позитивный голос 0
asdasdasdasd
asdasdasdasd
- #6
Зависит от организации цикла. Синхронный вызовет возмущения со стороны браузера — и вероятнее всего, скрипт будет прибит. Последующие строки при этом не будут выполнены. Асинхронный (на таймере) может крутиться хоть вечно.
Позитивный голос 0
Войдите или зарегистрируйтесь для ответа.
Поделиться:
Vkontakte Odnoklassniki Mail.ru Liveinternet Livejournal Facebook Twitter Reddit Pinterest Tumblr WhatsApp Telegram Viber Skype Line Gmail yahoomail Электронная почта Поделиться Ссылка
Странный бесконечный цикл for(;;) в Java, чем это полезно?
Задавать вопрос
спросил
Изменено 7 лет, 2 месяца назад
Просмотрено 2к раз
Хотя у меня есть некоторый опыт работы с Java, следующий код кажется мне немного странным:
открытый класс ForLoopTest{ public static void main(String[] args){ для(;;){} } }
Этот код компилируется нормально, хотя часть initialization-test-increment пуста, в отличие от обычного цикла for:
for(int i=0; i<10; i++){}
Поскольку код компилируется нормально, его синтаксис правильный.
Есть ли какое-либо практическое применение этого типа цикла for, когда нет части инициализации-теста-приращения?
- ява
- циклов
- цикл for
- бесконечный цикл
3
Эквивалентно while(true) {}
.
Нет реальной причины использовать или не использовать цикл for таким образом (и не часто вы будете писать цикл while(true)
).
5
Это один из способов записи бесконечного цикла. Это эквивалентно:
while(true){ }
Или:
логический цикл = true; пока (цикл) { //ничего не делать }
Или даже:
int TheAnswerToTheQuestionOfLifeTheUniverseAndEverything = 42; в то время как(theAnswerToTheQuestionOfLifeTheUniverseAndEverything == 42) { //ничего не делать }
0
Это бесконечный цикл. Способ, которым вы можете его использовать (не являясь бесконечным циклом), будет таким (вы, вероятно, никогда не будете использовать этот способ):
целое я = 0; для(;;) { если (я == 10) { перерыв; } я++; }
Ваш цикл for(;;){}
эквивалентен while(true) {}
Да, это бесконечный цикл .
Если у вас есть вопрос: есть ли смысл использовать это? Ответ возможно да .
Я приведу пример:
Что, если вы хотите сделать программу, которая время от времени непрерывно считывает измерения? например, монитор, показывающий вам, что делает запись дрона или что-то подобное?
Такой цикл может понадобиться для обновления изображения.
Но да, обычно это ни для чего не нужно.
Каяман прав. Цикл в таком формате должен иметь внутри какое-то условие выхода, иначе он, несомненно, будет бесконечным циклом. Большинство людей используют в этом случае while(true), так как его легче понять. Один проф однажды сказал мне, что единственное преимущество for(;;) {}
в том, что он выглядит более впечатляюще, чем while(true)
.
for(;;)
эквивалентно while(true)
. Причина, по которой вы чаще видите первое в коде, заключается в том, что это канонический способ кодирования бесконечного цикла в языке программирования C
, откуда Java позаимствовал множество синтаксических элементов и который является фоном многих разработчиков Java. .
Использование while(true)
может выглядеть более прямолинейно, но язык программирования C
не имел ни булевых типов, ни true
литерал в начале, поэтому эквивалент должен был быть while(1)
, что выглядит не лучше, чем for(;;)
. Это помогло последнему стать распространенным шаблоном, поскольку он был указан K&R (см. этот ответ) как идиома для вечного цикла.
Ну, а смена языка программирования не обязательно влечет за собой изменение привычек, поэтому for(;;)
в Java теперь встречается почти так же часто, как и в C. ) {} .
Один из вариантов использования, о котором я могу думать, - это если вам нужно выполнить какую-то операцию, как только файл семафора появится в каталоге. Вы можете продолжать проверять прибытие файла в бесконечном цикле, как только файл прибудет, выполните некоторую операцию и разорвите цикл
Как найти бесконечный цикл в веб-приложении Java?
Однажды наше веб-приложение Java достигает 100% загрузки ЦП. Перезапуск решил инцидент, но не проблему, потому что через несколько часов проблема вернулась. Мы подозревали бесконечный цикл, появившийся в новой версии, но мы не вносили никаких изменений в код или на сервер.
Нам удалось найти проблему, сделав несколько дампов потоков с помощью команды kill -QUIT и просмотрев и сравнив детали каждого потока. Мы обнаружили, что один стек вызовов потока появляется во всех дампах потоков. После анализа было условие цикла while, которое никогда не становится ложным для некоторых данных, которые регулярно обновлялись в базе данных.
Анализ нескольких дампов потоков веб-приложения действительно утомителен.
Знаете ли вы какой-нибудь лучший способ или инструменты для поиска такой проблемы в производственной среде?
- Java
- бесконечный цикл
- дамп потока
3
После некоторых запросов я нашел ответ в разделе Мониторинг и управление приложениями платформы Java SE 6:
Вы можете диагностировать циклический поток с помощью предоставленного JDK инструмента под названием JTop, который покажет время ЦП, используемое каждым потоком:
По имени потока вы можете найти трассировку стека этого потока на вкладке «Потоки», создав дамп потока с помощью команды kill -QUIT.
Теперь вы можете сосредоточиться на коде, вызывающем бесконечный цикл.
PS.: Кажется, можно ответить на мой собственный вопрос в соответствии с https://blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/: […] «да, это нормально, и даже рекомендуется отвечать на свои вопросы, если вы найдете хороший ответ раньше всех». […]
PS.: В случае, если домен sun.com больше не существует: Вы можете запустить JTop как автономный графический интерфейс:
$/bin/java -jar /demo/management/JTop/JTop.jar
Кроме того, вы можете запустить его как подключаемый модуль JConsole:
$/bin/jconsole -pluginpath /demo/management/JTop/JTop.jar
Решите проблему до того, как она возникнет! Используйте инструмент статического анализа, такой как FindBugs или PMD, как часть вашей системы сборки. Он не найдет все, но это хороший первый шаг.
2
Подумайте об использовании таких инструментов покрытия, как Cobertura. Это показало бы вам, что вы не тестировали эти кодовые пути.
Испытания ул. как это может стать очень громоздким, поэтому постарайтесь избежать этого, введя измерения качества.
В любом случае такие инструменты, как VisualVM, дадут вам хороший обзор всех потоков, поэтому становится относительно легко идентифицировать потоки, которые работают в течение неожиданно долгого времени.