Вступление
Условные операторы и циклы - очень важный инструмент в программировании. Есть немного вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно.
Вот что означает «управление потоком» - руководство выполнением нашей
программы вместо того, чтобы позволить ей выполняться построчно,
независимо от каких-либо внутренних или внешних факторов. Каждый язык
программирования поддерживает некоторую форму управления потоком, если
не явно через 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 иsumOfDigits5. Является ли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 хороши для выполнения блока кода неизвестное
количество раз, где условие проверяется каждый раз, когда блок кода
запускается повторно.