Вступление
Условные операторы и циклы - очень важный инструмент в программировании. Есть немного вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно.
Вот что означает «управление потоком» - руководство выполнением нашей
программы вместо того, чтобы позволить ей выполняться построчно,
независимо от каких-либо внутренних или внешних факторов. Каждый язык
программирования поддерживает некоторую форму управления потоком, если
не явно через if
s и for
s или аналогичные операторы - тогда он
неявно дает нам инструменты для создания таких конструкций, то есть
языки программирования низкого уровня обычно достигают этого эффекта с
большим go-to
командам.
Циклы были концепцией, которая использовалась задолго до того, как компьютерное программирование стало вообще чем-то, но первой, кто использовал программный цикл, была Ада Лавлейс, широко известная под своей девичьей фамилией - Байрон, при вычислении чисел Бернулли еще в 19 веке.
В Java есть несколько способов управления потоком кода:
- операторы if и if-else
- операторы переключения
- утверждения
while
иdo-while
for
иenhanced for
операторов- операторы
break
иcontinue
пока
Цикл - это набор инструкций, которые повторно выполняются до тех пор,
пока не будет выполнено какое-либо условие, или, альтернативно, пока
условие true
. В while
цикл в Java работает на последнем принципе,
повторяет блок кода, пока условие принимает значение true
:
while(condition) {
// Block of code to be executed
}
Когда Java встречает while
цикл он делает следующее:
- Это
condition
верно?- Да -> выполнить блок кода. Еще раз проверьте состояние.
- Нет -> не выполнять блок кода. Не проверяйте состояние снова.
Это означает, что если бы у нас был такой оператор, как while(true)
,
блок кода выполнялся бы бесконечно (или, по крайней мере, попытался бы
это сделать). Это называется бесконечным циклом, и его следует
избегать, если у нас нет способа выйти из цикла - обычно с помощью
оператора break
condition
может быть Boolean
выражение любого типа, такое же, как с
операторами if
Поскольку while
проверяет condition
перед выполнением любого кода,
возможно, что блок кода в цикле while никогда не будет выполнен, если
condition
было false
в начале.
Это отличается от for
, который обычно выполняется заданное количество
раз. while
циклы, с другой стороны, часто используются для выполнения
неизвестного количества раз.
Вот пример в while
цикл , который суммирует все цифры в int
.
int n = 123;
int sumOfDigits = 0;
while(n > 0) {
int lastDigit = n % 10; // Retrieves the last digit of n via the modulus operator
n = n / 10; // "Removes" the last digit from n via division
sumOfDigits += lastDigit; // Adds the current digit to the sum
}
System.out.println(sumOfDigits);
Выполнение этого кода работает следующим образом:
- Условие while проверяется,
n
равно 123, аsumOfDigits
равно 0. Является лиn > 0
равнымtrue
? Да -> выполнить код в цикле. - Условие while проверено,
n
равно 12, аsumOfDigits
равно 3. Является лиn > 0
равнымtrue
? Да -> выполнить код в цикле. - В то время как условие проверяется,
n
= 1 иsumOfDigits
5. Является лиn > 0
, равныхtrue
? Да -> выполнить код в цикле. - В то время как условие проверяется,
n
= 0 иsumOfDigits
равно 6. Является лиn > 0
, равныхtrue
? Нет -> выполнить первую строку после цикла, в нашем случае распечатать результат.
После трехкратного выполнения цикла while на консоль выводится значение 6.
Тело цикла while может быть пустым, и иногда разработчикам нравится
писать сокращенные while
когда это возможно. Кроме того, то же правило
сокращения if
и else
применяется к while
. Таким образом , одной
линии в while
цикл может быть переписан без скобок, например:
// This...
while(i < j) {
System.out.println("i " + i++ + " j " + j--);
}
// ...becomes this:
while(i < j)
System.out.println("i " + i++ + " j " + j--);
Также обратите внимание, что переменные, используемые в проверяемом
условии, могут быть изменены либо внутри while
либо внутри самого
проверенного условия:
while(++i < --j)
System.out.println("i " + i + " j " + j);
Оба из них приводят к одному и тому же результату:
i 1 j 9
i 2 j 8
i 3 j 7
i 4 j 6
Однако они могут снизить удобочитаемость, и в этом случае их следует избегать.
делать пока
Этот цикл делает по сути то же самое, что и while
, но гарантирует,
что блок кода будет выполнен хотя бы один раз .
Это потому, что, в отличие от while
, код выполняется до проверки
условия. Таким образом, даже если мы начнем с false
условия, он
выполнит код, а затем проверит, следует ли сделать это снова:
int i = 0;
// This will print once
do {
System.out.println(i);
i--;
} while(i > 0);
Вывод кода:
0
Когда код достигает while(i > 0)
, он останавливает итерации.
Например, один из вариантов использования do-while
- спросить
пользователя, хотят ли они попробовать что-то еще раз в случае неудачи.
do {
// Try to connect to a server, access a resource, etc...
String status = connectToServer();
// Ask user whether they want to try again
String userInput = getUserInput("Connection status is " + status + ". Want to try again?");
} while(userInput == "yes");
Это можно сделать с помощью обычного в while
цикла, но это более
читаемые и интуитивно понятного таким образом.
Заключение
Управление потоком в коде необходимо абсолютно для каждого приложения. Заявления, которые изменяют поток кода, являются фундаментальными строительными блоками, и каждый начинающий разработчик должен полностью контролировать / осознавать, как они работают.
while
и do-while
хороши для выполнения блока кода неизвестное
количество раз, где условие проверяется каждый раз, когда блок кода
запускается повторно.