Вступление
Условные операторы и циклы - очень важный инструмент в программировании. Есть немного вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно.
Вот что означает «управление потоком» - руководство выполнением нашей
программы вместо того, чтобы позволить ей выполняться построчно,
независимо от каких-либо внутренних или внешних факторов. Каждый язык
программирования поддерживает некоторую форму управления потоком, если
не явно через if
s и for
s или аналогичные операторы - тогда он
неявно дает нам инструменты для создания таких конструкций, то есть
языки программирования низкого уровня обычно достигают этого эффекта с
большим go-to
командам.
Циклы были концепцией, которая использовалась задолго до того, как компьютерное программирование стало вообще чем-то, но первой, кто использовал программный цикл, была Ада Лавлейс, широко известная под своей девичьей фамилией - Байрон, при вычислении чисел Бернулли еще в 19 веке.
go-to
следует избегать в большинстве ситуаций, когда мы используем
язык программирования, который дает нам инструменты, чтобы избежать
этого, например, Java и все удаленно похожие языки (есть небольшое
исключение из этого правила при разрыве вложенных
циклов ) .
В Java есть несколько способов управления потоком кода:
- операторы if и if-else
- операторы переключения
- утверждения
while
иdo-while
for
иenhanced for
операторов- операторы
break
иcontinue
Оператор if
Оператор if
вероятно, является наиболее распространенной формой
управления потоком независимо от языка. Это очень просто и интуитивно
понятно:
if(true) {
//execute this code block if the argument/expression is true
//some more code
}
Поскольку во многих случаях требуется выполнить только одну строку, вы можете пропустить использование фигурных скобок и блока кода и просто сделать отступ для следующей строки, хотя это работает только для одной строки :
if(true)
System.out.println("Inside the if block");
System.out.println("I have nothing to do with the if block!");
System.out.println("Neither do I!");
Обычно мы не вводим boolean
значения, как в этих примерах, а
используем выражение:
if(username != null)
System.out.println(username);
if(argument >= 10)
System.out.println("The input is higher or equal than 10");
Если выражение false
, код, принадлежащий if
просто пропускается:
if(1 > 5)
System.out.println("Hello");
System.out.println(" World!");
И результат:
World!
Заявление if-else
Мы редко хотим просто пропустить кусок кода, если выражение
оценивается как false
. Обычно в этом случае мы хотим сделать что
else
if(expression) {
//code that executes only if the expression is true
}
else {// optional
//code that executes only if the expression is false
}
Конечно, вы можете использовать else
вместе с сокращенным оператором
if
if(expression)
//code that executes only if the expression is true
else
//code that executes only if the expression is false
Однако это не рекомендуется, если вы не имеете дело с простыми
операторами, особенно с вложенными if
так как трудно понять, «какому
if
принадлежит конкретное else
». Использование скобок устранит
двусмысленность проблемы, если вы сочтете этот подход нечитаемым.
Оператор else
является обязательным, поэтому нет необходимости писать
пустой else {}
если мы не хотим, чтобы что-либо происходило, если
expression
ложно.
Оператор else
внутренне привязан к if
и не может существовать без
него. Он должен появиться сразу после if
противном случае появится
ошибка компилятора «else без if».
В большинстве случаев мы хотим сравнить что-то на предмет равенства - имеет ли одна переменная то же значение, что и другая, или она меньше / больше другой:
String s = "smol";
if (s.length() > 8)
System.out.println("s has too many characters!");
else
System.out.println("Ok, so basically, s is very " + s);
Оператор >
здесь имеет обычное значение «больше чем», а Java
поддерживает обычную группу операторов отношения . К ним относятся
<
, >
, <=
, =>
, ==
проверки на равенство и !=
Проверки на
неравенство.
Примечание. Обязательно используйте ==
в операторах if
=
,
иначе вы можете присвоить значение вместо его сравнения.
2 < 5 //true
2 < 2 //false
2 <= 2 //true
2 == 3 //false
2 != 3 //true
Примечание. В большинстве случаев мы сравниваем String
переменные
не с помощью ==
а с помощью .equals()
. ==
проверяет равенство
ссылок на объекты. Для примитивных типов ( int
, char
и т. Д.) Это
то же самое, что и проверка того, имеют ли они одинаковое значение, но
со строками чаще всего этого не происходит.
if(string1.equals(string2))
//code to be executed if the strings are equal by value
Вложенные операторы if
У нас может быть более одного if
, либо путем вложения (помещая один
if
внутри другого) else if
в конце нашего предыдущего if
:
int ourNumber = 10;
if(ourNumber > 8){
if(ourNumber % 2 == 0){
System.out.println("The number is larger than 8 and even");
}
}
else if (ourNumber == 1) {
System.out.println("1 is less than 8, so the previous if block isn't executed");
}
else {
System.out.println("ourNumber is less than 8 and different than 1");
}
else
всегда «принадлежат» if
того же уровня, поэтому
else if (ourNumber == 1)
в нашем коде принадлежит if(ourNumber > 8)
а не вложенному if
который проверяет, является ли число четным.
Вы можете иметь столько else if
сколько хотите, но только один else
, который идет последним. Каждый if
, else if
и else
, имеющий
значение true
будет выполняться:
Несколько выражений в одном выражении if
Еще одна очень полезная вещь - это возможность проверять несколько
условий в одном, if
:
int ourNumber = 10;
if(ourNumber > 5 && (ourNumber % 2 == 0)){
System.out.println("The number is larger than 8 and even");
}
Оператор &&
- один из логических операторов, поддерживаемых Java.
boolExpr
используется как сокращение для boolean expression
.
Напоминание: boolean
выражение - это выражение, которое может быть
оценено как true
или false
, т.е. оно также может быть выражением,
содержащим логический оператор, как мы видим здесь:
!boolExpr
-!
является отрицанием, оно оцениваетtrue
выражение какfalse
и наоборот.boolExpr1 & boolExpr2
- оператор AND принимает значениеtrue
если оба выраженияtrue
.boolExpr1 | boolExpr2
- оператор ИЛИtrue
если хотя бы одно из выраженийtrue
.boolExpr1 && boolExpr2
- оператор короткого замыкания AND принимает значениеtrue
только еслиboolExpr1
boolExpr2
boolExpr1 иtrue
. Он называется оператором короткого замыкания, потому что, если первое выражениеfalse
, оно даже не оценивает второе выражение, поскольку основное условие, которое оба должны бытьtrue
никогда не может возникнуть. С простыми выражениями это не влияет на код значимым образом, но в производственном коде оба выражения могут быть дорогостоящими операциями, и такой подход может значительно оптимизировать код.boolExpr1 || boolExpr2
- оператор короткого замыкания ИЛИ принимает значениеtrue
если хотя бы одно изboolExpr1
иboolExpr2
true
. Версия с коротким замыканием|
оператор.boolExpr1 ^ boolExpr2
- оператор XOR оценивается какtrue
только еслиboolExpr1
иboolExpr2
оцениваются по-разному, т.е. если только один из нихtrue
а другойfalse
.
|
|
true && false //false
(2 < 5) && (2 != 3) //true
false || true //true
true && ((false || false) ^ true) //true
(true && false) || false // false
Настоятельно рекомендуется использовать круглые скобки всякий раз, когда они имеют смысл. Последний пример работает так же без скобок, но полагаться на приоритет оператора чрезвычайно рискованно и приводит к нечитаемому коду.
Тернарные конструкции
Единственный тернарный оператор (оператор, который принимает три
операнда) в Java - это оператор ?:
Он работает как очень компактный
оператор if-else
int max = 0;
if (a > b)
max = a;
else max = b;
//can be written as
int max = (a > b) ? a : b;
Вот как обычно выглядит троичная конструкция:
(expression) ? returnValueIfTrue : returnValueIfFalse
Тернарные конструкции могут работать и без скобок, хотя, как правило, их удобнее использовать:
int max = a > b ? a : b;
Вы также можете использовать тернарные конструкции для изменения переменных:
System.out.println("10% discount for orders above $50!");
double orderPrice = 55;
double finalPrice = orderPrice > 50 ? orderPrice*09 : orderPrice;
System.out.println("Your final price is $" + finalPrice);
И результат:
Your final price is $49.5
Используя конструкцию, мы также можем вызывать методы:
public void someMethod() {
String userRole = "Admin";
String result = userRole.equals("Admin") ? greetAdmin() : greetUser();
System.out.println(result);
}
static String greetAdmin() {
return "Hello Admin!";
}
static String greetUser() {
return "Hello User!";
}
По логике, это привело бы к:
Hello Admin!
Вложенные тернарные конструкции
System.out.println("10% discount for all orders above $50 and additional $5 off if your order exceedes 2 items!");
double orderPrice = 140;
int quantity = 5;
double finalPrice = (orderPrice > 50) ? (quantity > 2) ? (orderPrice*0.9)-5 : orderPrice*0.9 : orderPrice;
System.out.println("Your final price is: $" + finalPrice);
Поскольку оба условия true
, результат будет следующим:
10% discount for all orders above $50 and additional $5 off if your order exceedes 2 items!
Your final price is: $121.0
Однако такой подход ужасно нечитаем. По возможности избегайте вложения троичных конструкций, хотя, если необходимо, разбейте их на более простые блоки. Например, этот пример можно сделать более читабельным:
System.out.println("10% discount for all orders above $50 and additional $5 off if your order exceedes 2 items!");
double orderPrice = 140;
int quantity = 5;
double finalPrice = (orderPrice > 50) ?
(quantity > 2) ?
(orderPrice*0.9)-5 : orderPrice*0.9
: orderPrice;
System.out.println("Your final price is: $" + finalPrice);
Заключение
Управление потоком в коде необходимо абсолютно для каждого приложения.
Такие утверждения, как if
и if-else
являются фундаментальными
строительными блоками, и каждый начинающий разработчик должен полностью
контролировать / осознавать, как они работают.