Українська
Операції та розгалуження
Арифметика, рівність і логічні операції
Для цілих 7 / 2 дорівнює 3; 7 / 2.0 – 3.5. Остача % для від’ємного діленого може бути від’ємною: -7 % 3 дає -1. Якщо потрібен невід’ємний індекс для додатного модуля, оберіть відповідне правило mod та перевірте від’ємний вхід окремим тестом.
== порівнює значення через equals, === – тотожність посилань. Упаковані числа JVM можуть кешуватися, тому === непридатне для перевірки числової рівності. Рядки за змістом також порівнюють через ==.
Логічні &&, ||, ! працюють із Boolean. Ціле число не перетворюється автоматично на істину. Для побітових операцій використовують іменовані and, or, xor, shl, shr, ushr. Це інша група операцій, ніж логічні умови.
kotlin
fun main() {
val permissions = 0b0101
val canRead = (permissions and 0b0001) != 0
val canWrite = (permissions and 0b0010) != 0
println("read=$canRead; write=$canWrite")
println(1 shl 3)
}Результат: read=true; write=false, потім 8. У простій задачі не варто кодувати багато станів бітами, якщо окремі логічні змінні зрозуміліші. Бітова маска доречна, коли вона є частиною контракту.
if як вираз
Умовний вираз повертає значення останнього виразу обраної гілки. Окремого тернарного оператора ?: у значенні інших мов тут немає: ?: у Kotlin є оператором для null, а вибір за умовою виконує if.
kotlin
fun main() {
val amount = 1200
val fee = if (amount >= 1000) 0 else 50
println("Доставка: $fee грн")
val status = if (fee == 0) {
"безкоштовна доставка"
} else {
"платна доставка"
}
println(status)
}Результат: Доставка: 0 грн та безкоштовна доставка. Тариф є навчальним. Перевірте 999 і 1000, бо саме на межі найпростіше переплутати > та >=. Гілки виразу повинні разом давати узгоджений тип.
Якщо if лише запускає дію, гілка else не завжди потрібна. Якщо результат присвоюється змінній, треба визначити результат на всіх можливих шляхах. Не додавайте вкладені if, коли раннє повернення може окремо відхилити неправильний вхід.
when і повнота розгалуження
when із суб’єктом порівнює значення з умовами гілок. У гілці можна перелічити кілька значень, діапазон або перевірку типу. Перша відповідна гілка виконується; подальшого «провалювання» немає.
kotlin
fun main() {
val score = 84
val grade = when (score) {
in 90..100 -> "A"
in 82..89 -> "B"
in 74..81 -> "C"
in 64..73 -> "D"
in 60..63 -> "E"
in 35..59 -> "FX"
in 0..34 -> "F"
else -> "помилка"
}
println(grade)
}Результат – B. Наведені пороги є контрактом навчальної задачі. else обробляє значення поза 0–100, а не приховує їх як найнижчу оцінку. Для when без суб’єкта гілки є логічними умовами: цей запис зручний для різних властивостей одного вводу.
У сучасному Kotlin можна додати умову-охоронець після основної умови. Вона перевіряється лише коли основна умова вже виконана:
kotlin
fun main() {
val value: Any = "Kotlin"
val label = when (value) {
is String if value.length > 3 -> "довгий текст"
is String -> "короткий текст"
else -> "інший тип"
}
println(label)
}Результат: довгий текст. Не ускладнюйте таким синтаксисом простий вибір за числом. На цьому етапі важливіше правильно сформулювати неперетинні гілки й перевірити значення на кожній межі.
Знімок екрана
Debug score=82 then81; inspect selected branch and grade.
Рис. 2.4. Перевірка гілки when на граничному значенні