Условный оператор if-else в Kotlin

В языках программирования условные операторы – это инструмент для обеспечения ветвления в программах. Это значит, что в зависимости от сложившихся условий выполнение программы может идти по разным сценариям. Обычно не всей программы, а какой-то ее части. На блок-схемах ветвление обозначают ромбом, в котором может быть записано условие – логическое выражение, в процессе вычисления которого получается либо истина, либо ложь.

Рассмотрим простую программу на языке Kotlin с условным оператором и нарисуем соответствующую ей блок-схему. (Примечание. Здесь в логическом выражении используется двойное равенство. Это оператор сравнения, он возвращает истину, если левый операнд равен правому.)

fun main() {
    val s = readLine()
    if (s == "Hello")
        println("World")
    else
        println("Epic fail")
    println("Bye")
}

Программа на Kotlin с оператором if-else

Блок-схема if-else

По блок-схеме программа выполняется сверху вниз. Сначала происходит связывание введенной пользователем строки с переменной s. Далее выполняется выражение, сравнивающее значение s со строкой "Hello". От результата этого сравнения будет зависеть, какая из двух следующих команд, находящихся на одном горизонтальном уровне, – println("World") или println("Epic fail") – будет выполнена. В случае true – левая, в случае false – правая.

Не может быть ситуации, когда будут выполнены обе команды. Либо одна, либо другая. Либо тело ветки if, либо тело ветки else.

Последняя команда, выводящая строку "Bye", будет исполнена в любом случае, так как она находится за пределами условного оператора if-else.

Тела веток условного оператора 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 = readLine()
 
    if (s == "Hello")
        println("World")
 
    println("Bye")
}

Теперь, если пользователь введет что-то отличное от "Hello", то увидит на экране только "Bye". Если же введет "Hello", то ответом ему будет как "World", так и "Bye". Блок-схема примет такой вид:

Блок схема с if, без else

В большинстве языков программирования if-else – это только оператор, команда языка. Так если слово val обозначает объявление переменной, то команда if-else просто создает в программе ветвление.

Однако в Kotlin if-else – это больше чем просто оператор, эта конструкция также является выражением. Особенностью выражений является то, что они что-нибудь возвращают в программу. Так выражение a + b вернет сумму чисел, выражение readLine() – строку, даже 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-версия курса с ответами к практическим работам

Приложение для Android "Kotlin. Курс"