Kotlinの短絡評価

※本記事はQiitaに投稿していた記事のexportです(元投稿日: 2018/6/22)

短絡評価とは https://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1

「≪左辺≫ ≪論理演算子≫ ≪右辺≫」というような、論理演算子による式(論理演算子式)があるとする。左辺(第一引数)を評価した段階で式全体の値が定まらない場合のみ右辺(第二引数)を評価する、というのが短絡評価である。例えば、論理ANDの第一引数を評価した結果が false であれば、式全体は必ず false になるし、論理ORの第一引数が true であれば、式全体は必ず true になるので、第二引数を評価するまでもないので、そこで打切るのである。

どういうときに嬉しいのかもWikipediaに書いてある。

1つは、後半の部分式に時間のかかる処理を置き、最初の部分式でその処理が必要か否かのチェックをするようにすれば、無駄な関数呼び出しなどを減らすことができる。2つめとして、後半の部分式が実行時エラーを起こすかどうかのチェックを前半で行うというコーディングが考えられる。

言語によって評価順は異なるので、新しく言語を学ぶときには知っておきたい。 Wikipediaにもある通り、Java&& ||が短絡評価あり、 & | が短絡評価なし。 そしてKotlinの場合は、&& ||が短絡評価あり、 and or が短絡評価なし。

Try Kotlin 上で試してみる。

fun main(args: Array<String>) {

    println("短絡評価する")
    if ( returnTrue() && returnFalse() ){}
    println("")
    if ( returnFalse() && returnTrue() ){}

    println("\n短絡評価しない")
    if ( returnTrue() and returnFalse() ){}
    println("")
    if ( returnFalse() and returnTrue() ){}

}

fun returnTrue(): Boolean{
    print("true")
    return true
}

fun returnFalse(): Boolean{
    print("false")
    return false
}

実行結果

短絡評価する
truefalse
false       // 左辺の時点でfalseが確定するので右辺は実行しない
短絡評価しない
truefalse
falsetrue   // 左辺がfalseでも右辺を実行する