Условный оператор if-else в Kotlin
В языках программирования условные операторы – это инструмент для обеспечения ветвления в программах. Это значит, что в зависимости от сложившихся условий выполнение программы может идти по разным сценариям. Обычно не всей программы, а какой-то ее части. На блок-схемах ветвление обозначают ромбом, в котором может быть записано условие – логическое выражение, в процессе вычисления которого получается либо истина, либо ложь.
Рассмотрим простую программу на языке Kotlin с условным оператором и нарисуем соответствующую ей блок-схему. (Примечание. Здесь в логическом выражении используется двойное равенство. Это оператор сравнения, он возвращает истину, если левый операнд равен правому.)
fun main() { val s = readln() if (s == "Hello") println("World") else println("Epic fail") println("Bye") }
По блок-схеме программа выполняется сверху вниз. Сначала происходит связывание введенной пользователем строки с переменной s. Далее выполняется выражение, сравнивающее значение s со строкой "Hello". От результата этого сравнения будет зависеть, какая из двух следующих команд, находящихся на одном горизонтальном уровне, – println("World")
или println("Epic fail")
– будет выполнена. В случае true
– левая, в случае false
– правая.
Не может быть ситуации, когда будут выполнены обе команды. Либо одна, либо другая. Либо тело ветки if
, либо тело ветки else
.
Последняя команда, выводящая строку "Bye", будет исполнена в любом случае, так как она находится за пределами условного оператора if-else.
Тела веток условного оператора могут состоять из нескольких команд. В этом случае тело обязательно надо заключать в фигурные скобки.
import kotlin.random.Random fun main() { val ch1 = Random.nextInt(97,123) val ch2 = Random.nextInt(97,123) if (ch1 <= ch2) { println(ch1.toChar()) println(ch2.toChar()) println(ch2 - ch1) } else { println(ch2.toChar()) println(ch1.toChar()) println(ch1 - ch2) } }
В примере переменным ch1 и ch2 присваиваются случайные целые числа в диапазоне от 97 до 122 включительно. Эти номера соответствуют английским буквам в таблице символов. С помощью функции toChar()
мы можем преобразовать числовой код в символ.
Ветвление позволяет нам всегда выводить на экран сначала букву с меньшим кодом, независимо от того, связана она с ch1 и ch2. Также вычисляется расстояние между буквами. Операция сравнения <=
– это меньше или равно.
Условный оператор if-else может использоваться в урезанной форме, то есть без ветки else
. Уберем ее в нашей первой программе:
fun main() { val s = readln() if (s == "Hello") println("World") println("Bye") }
Теперь, если пользователь введет что-то отличное от "Hello", то увидит на экране только "Bye". Если же введет "Hello", то ответом ему будет как "World", так и "Bye". Блок-схема примет такой вид:
В большинстве языков программирования if-else – это только оператор, команда языка. Так если слово val
обозначает объявление переменной, то команда if ... else
просто создает в программе ветвление.
Однако в Kotlin if-else – это больше чем просто оператор, эта конструкция также является выражением. Особенностью выражений является то, что они что-нибудь возвращают в программу. Так выражение a + b
вернет сумму чисел, выражение readln()
– строку, даже println()
возвращает "невидимый" объект (то, что она выводит на экран – это ее "работа", а не то, что она возвращает). Выражение if-else возвращает значение последнего выражения тела ветки, которая была исполнена.
Вспомним программу из предыдущего урока:
import kotlin.random.Random fun main() { val s: String = "number: " val i: Int = Random.nextInt(1,10) val f: Double if (i > 5) f = i * 1.5 else f = i * 2.0 println(s + i) println(f) }
Если конструкция if-else – это выражение, значит возвращаемое им значение можно присвоить переменной. Сделаем это, связав if-else с переменной v:
import kotlin.random.Random fun main() { val s: String = "number: " val i: Int = Random.nextInt(1,10) val f: Double val v = if (i > 5) f = i * 1.5 else f = i * 2.0 println(s + i) println(f) println(v) }
Пример выполнения программы:
number: 9 13.5 kotlin.Unit
Значение переменной v равно некому kotlin.Unit
. Это специально предусмотренный в языке программирования объект-пустышка, его возвращают функции и другие выражения, когда возвращать им больше нечего. В нашем примере в теле ветки (неважно какой) после умножения выполняется операция присваивания. Эта операция и возвращает объект Unit
, который связывается с переменной v.
Не путайте сам факт присваивания, когда значение связывается с f (это "работа" присваивания), и выражение присваивания, когда в программу что-то возвращается после его выполнения.
Если из тела убрать присваивание, останется только операция умножения. В этом случае переменной, связанной с выражением if-else, будет присваиваться произведение. Избавимся от переменной v и сразу присвоим f.
import kotlin.random.Random fun main() { val s: String = "number: " val i: Int = Random.nextInt(1,10) val f: Double f = if (i > 5) i * 1.5 else i * 2.0 println(s + i) println(f) }
Переменной f будет присвоено значение либо i * 1.5
, либо i * 2.0
. Код можно сократить, совместив присвоение с объявлением переменной:
import kotlin.random.Random fun main() { val s: String = "number: " val i: Int = Random.nextInt(1,10) val f = if (i > 5) i * 1.5 else i * 2.0 println(s + i) println(f) }
Несмотря на то, что Kotlin не только позволяет использовать if-else в качестве выражения, но и поощряет, в этом начальном курсе мы постараемся так не делать, так как это может усложнить восприятие и понимание кода, пока вы к нему не привыкните.
Практическая работа:
Напишите программу, которая генерирует случайное число от -5 до 5 включительно. Если это число оказывается отрицательным, то на экран выводится -1; если положительным – выводится 1, если равно нулю – выводится 0.
PDF-версия курса с ответами к практическим работам