早速ですがこのコードをご覧ください。
fun main() {
val tmp1: Int? = 0
val tmp2: Int = 1
println(tmp1 ?: 0 + tmp2)
}
1
が表示されると思った方はお気をつけください。実際に出力されるのは0
です。
0
だと思った方はもうすでにNull合体演算子と優先順位をマスターしているので、このままそっとブラウザバックしてください。
なぜ 0 と表示されるのか
至極単純な理由で?:
は+
より優先順位が低いためtmp1 ?: 0 + tmp2
はtmp1 ?: (0 + tmp2)
と解釈され最終的に0 ?: 1
というふうになるため0
が出力されるのです。
ちなみにKotlinだけでなくC#やJavaScript(というかほとんどの言語?)でも同じで
int? tmp1 = 0;
int tmp2 = 1;
System.Console.WriteLine(tmp1 ?? 0 + tmp2);
const tmp1 = 0;
const tmp2 = 1;
console.log(tmp1 ?? 0 + tmp2);
上のコードは1
ではなく0
と表示されます。
あとがき
あまりにも初歩的なミスですが、だからこそミスに気づきにくいと思います。
私のような犠牲者が再び出ないように戒めの意を込めて書きました。