Boolesche Werte
if-Ausdrücke demonstrierten den Operator “nicht”!, der einenBoolescherWert negiert. Dieses Kapitel führt mehr in die Boolesche Algebra ein.
Wir beginnen mit den Operatoren “und” und “oder”:
-
&&(und): Erzeugtwahrnur, wenn derBoolescherAusdruck links vom Operator und der rechts beidewahrsind. -
||(oder): Erzeugtwahr, wenn entweder der Ausdruck links oder rechts vom Operatorwahrist, oder wenn beidewahrsind.
In diesem Beispiel bestimmen wir, ob ein Geschäft geöffnet oder geschlossen ist, basierend auf
der Stunde:
// Booleans/Open1.kt
fun isOpen1(hour: Int) {
val open = 9
val closed = 20
println("Operating hours: $open - $closed")
val status =
if (hour >= open && hour < closed) // [1]
true
else
false
println("Open: $status")
}
fun main() = isOpen1(6)
/* Output:
Operating hours: 9 - 20
Open: false
*/
main() ist ein einzelner Funktionsaufruf, daher können wir einen Ausdruckskörper verwenden, wie in Funktionen beschrieben.
Der if-Ausdruck in [1] prüft, ob hour zwischen der Öffnungszeit und der Schließzeit liegt, daher kombinieren wir die Ausdrücke mit dem Boolean && (und).
Der if-Ausdruck kann vereinfacht werden. Das Ergebnis des Ausdrucks if(cond) true else false ist einfach cond:
// Booleans/Open2.kt
fun isOpen2(hour: Int) {
val open = 9
val closed = 20
println("Operating hours: $open - $closed")
val status = hour >= open && hour < closed
println("Open: $status")
}
fun main() = isOpen2(6)
/* Output:
Operating hours: 9 - 20
Open: false
*/
Lassen Sie uns die Logik umkehren und überprüfen, ob das Geschäft derzeit geschlossen ist. Der “or”-Operator || liefert true, wenn mindestens eine der Bedingungen erfüllt ist:
// Booleans/Closed.kt
fun isClosed(hour: Int) {
val open = 9
val closed = 20
println("Operating hours: $open - $closed")
val status = hour < open || hour >= closed
println("Closed: $status")
}
fun main() = isClosed(6)
/* Output:
Operating hours: 9 - 20
Closed: true
*/
Boolean-Operatoren ermöglichen komplizierte Logik in kompakten Ausdrücken. Allerdings kann es leicht verwirrend werden. Streben Sie nach Lesbarkeit und spezifizieren Sie Ihre Absichten explizit.
Hier ist ein Beispiel für einen komplizierten Boolean-Ausdruck, bei dem unterschiedliche Auswertungsreihenfolgen zu unterschiedlichen Ergebnissen führen:
// Booleans/EvaluationOrder.kt
fun main() {
val sunny = true
val hoursSleep = 6
val exercise = false
val temp = 55
// [1]:
val happy1 = sunny && temp > 50 ||
exercise && hoursSleep > 7
println(happy1)
// [2]:
val sameHappy1 = (sunny && temp > 50) ||
(exercise && hoursSleep > 7)
println(sameHappy1)
// [3]:
val notSame =
(sunny && temp > 50 || exercise) &&
hoursSleep > 7
println(notSame)
}
/* Output:
true
true
false
*/
Die Boolean-Ausdrücke sind sunny, temp > 50, exercise und hoursSleep > 7. Wir lesen happy1 als “Es ist sonnig und die Temperatur ist größer als 50 oder ich habe Sport getrieben und mehr als 7 Stunden geschlafen.” Aber hat && Vorrang vor || oder umgekehrt?
Der Ausdruck in [1] verwendet die Standardauswertungsreihenfolge von Kotlin. Dies ergibt dasselbe Ergebnis wie der Ausdruck in [2], da ohne Klammern die “und”-Operationen zuerst ausgewertet werden, dann das “oder”. Der Ausdruck in [3] verwendet Klammern, um ein anderes Ergebnis zu erzielen. In [3] sind wir nur glücklich, wenn wir mindestens 7 Stunden geschlafen haben.
Übungen und Lösungen finden Sie auf www.AtomicKotlin.com.