Автор оригинала: Olivera Popović.
Вступление
Условные операторы и циклы являются очень важным инструментом в программировании. Существует не так много вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно.
Вот что означает “управление потоком” – руководство выполнением нашей программы, вместо того, чтобы позволять ей выполняться построчно независимо от каких-либо внутренних или внешних факторов. Каждый язык программирования поддерживает ту или иную форму управления потоком, если не явно с помощью if
s и для
s или аналогичных операторов – тогда он неявно предоставляет нам инструменты для создания таких конструкций, т. Е. Языки программирования низкого уровня обычно достигают того, что влияет на множество команд go-to
.
Циклы были концепцией, используемой задолго до того, как компьютерное программирование вообще стало чем – то, но первым человеком , использовавшим программный цикл, была Ада Лавлейс, широко известная под своей девичьей фамилией Байрон, при вычислении чисел Бернулли , еще в 19 веке.
переход к командам
следует избегать в большинстве ситуаций, когда мы используем язык программирования, который предоставляет нам инструменты, позволяющие избежать этого, например Java и все удаленно похожие языки (есть небольшое исключение из этого правила при разрыве вложенных циклов ).
В Java существует несколько способов управления потоком кода:
- утверждения if и if-else
- операторы переключения
- операторы while и do-while
- для и улучшено для заявлений
- прервите и продолжите выступления
Заявление 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!");
Как правило, мы не вводим логические
значения, как в этих примерах, а скорее используем выражение:
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
Мы редко хотим просто пропустить фрагмент кода, если выражение оценивается как ложное
. Как правило, мы хотим сделать что-то еще
в этом случае:
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
s, поскольку трудно понять, “к какому if
принадлежит конкретный еще
“. Использование скобок устранит двусмысленность проблемы, если вы сочтете этот подход нечитаемым.
Оператор else
является необязательным, поэтому нет необходимости писать пустой блок else {}
, если мы не хотим, чтобы что-либо произошло, если выражение | является ложным.
Оператор else
внутренне связан с оператором if
и не может существовать без него. Он должен появиться сразу после оператора if
, иначе появится ошибка компилятора “иначе без 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 поддерживает обычную группу реляционных операторов . К ним относятся <
, >
, <=
, =>
, ==
проверяет равенство и !=
проверяет неравенство.
Примечание: Обязательно используйте ==
в если
операторы вместо =
, иначе вы можете присвоить значение вместо сравнения.
2 < 5 //true 2 < 2 //false 2 <= 2 //true 2 == 3 //false 2 != 3 //true
Примечание: Большую часть времени мы сравниваем Строковые
переменные не с помощью ==
, а с помощью метода .equals ()
. ==
проверяет равенство ссылок на объекты. Для примитивных типов ( int
, char
и т.д.) Это то же самое , что проверять, имеют ли они одинаковое значение, но со строками это чаще всего не так.
if(string1.equals(string2)) //code to be executed if the strings are equal by value
Вложенные операторы if
Мы можем подключить более одного if
оператора, либо вложив (поместив один if
оператор внутри другого), либо добавив еще, если
в конце нашего предыдущего если
:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
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"); }
еще
блоки всегда “принадлежат” если
одного и того же уровня, поэтому еще если (ваш номер)
в вашем коде принадлежит если(наше число > 8)
, а не вложенному если
, который проверяет, четное ли число.
У вас может быть столько еще, если
блоков, сколько вы хотите, но только один еще
блок, который идет последним. Каждый если
, еще, если
и еще
блок, который оценивается как true
, будет выполнен:
Несколько выражений в одном операторе if
Еще одна очень полезная вещь-возможность проверять несколько условий в одном если
:
int ourNumber = 10; if(ourNumber > 5 && (ourNumber % 2 == 0)){ System.out.println("The number is larger than 8 and even"); }
Оператор &&
является одним из логических операторов , поддерживаемых Java. BoolExpr используется в качестве сокращения для
логического выражения . Напоминание:
логическое выражение-это выражение , которое может быть оценено как
true или
false , т. Е. оно также может быть выражением, содержащим логический оператор, как мы можем видеть здесь:
!BoolExpr
–!
является отрицанием, оно оценивает выражениеtrue
вfalse
и наоборот.bool Expr1 & bool Expr2
– оператор И принимает значениеtrue
, если оба выраженияистинны
.bool Expr1 | bool Expr2
– оператор ИЛИ принимает значениеtrue
, если по крайней мере одно из выраженийистинно
.bool Expr1 && bool Expr2
– оператор короткого замыкания | И принимает значение trueтолько в том случае, если
boolExpr1и
bool Expr2оба
истинны. Это называется оператором
короткого замыкания , потому что, если первое выражение ложно, оно даже не будет оценивать второе выражение как основное условие, которое
оба должны быть истинныминикогда не может произойти. С помощью простых выражений это не влияет на код значимым образом, но в производственном коде оба выражения могут быть дорогостоящими операциями, и такой подход может значительно оптимизировать код.
bool Expr1bool Expr2
– оператор короткого замыкания | ИЛИ принимает значение true, если по крайней мере один из
boolExpr1и
bool Expr2является
истинным. A
короткое замыкание версия |оператора.
bool Expr1 ^ bool Expr2- оператор
XOR принимает значение trueтолько в том случае, если
boolExpr1и
bool Expr2оцениваются по-разному, т. Е. Если только
один из них истинен, а другой
ложен.
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);
Поскольку оба условия являются истинными
, вывод будет:
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
, являются фундаментальными строительными блоками, и каждый начинающий разработчик должен полностью контролировать/осознавать, как они работают.