Управление потоком Java: операторы if и if-else

Введение Условные операторы и циклы - очень важный инструмент в программировании. Есть немного вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно. Вот что означает «управление потоком» - руководство выполнением нашей программы вместо того, чтобы позволить ей выполняться построчно, независимо от каких-либо внутренних или внешних факторов. Каждый язык программирования поддерживает ту или иную форму управления потоком, если не явно через ifs, fors или аналогичные операторы - тогда он неявно дает нам инструменты для

Вступление

Условные операторы и циклы - очень важный инструмент в программировании. Есть немного вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно.

Вот что означает «управление потоком» - руководство выполнением нашей программы вместо того, чтобы позволить ей выполняться построчно, независимо от каких-либо внутренних или внешних факторов. Каждый язык программирования поддерживает некоторую форму управления потоком, если не явно через if s и for s или аналогичные операторы - тогда он неявно дает нам инструменты для создания таких конструкций, то есть языки программирования низкого уровня обычно достигают этого эффекта с большим go-to командам.

Циклы были концепцией, которая использовалась задолго до того, как компьютерное программирование стало вообще чем-то, но первой, кто использовал программный цикл, была Ада Лавлейс, широко известная под своей девичьей фамилией - Байрон, при вычислении чисел Бернулли еще в 19 веке.

go-to следует избегать в большинстве ситуаций, когда мы используем язык программирования, который дает нам инструменты, чтобы избежать этого, например, Java и все удаленно похожие языки (есть небольшое исключение из этого правила при разрыве вложенных циклов ) .

В Java есть несколько способов управления потоком кода:

Оператор 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 .
1
<!-- -->
 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 являются фундаментальными строительными блоками, и каждый начинающий разработчик должен полностью контролировать / осознавать, как они работают.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus

Содержание