1
0

More than 1 year has passed since last update.

Null合体演算子(?:とか??)を使うときは優先順位に気をつけろ

Posted at

早速ですがこのコードをご覧ください。

fun main() {
    val tmp1: Int? = 0
    val tmp2: Int = 1
    println(tmp1 ?: 0 + tmp2)
}

1が表示されると思った方はお気をつけください。実際に出力されるのは0です。
0だと思った方はもうすでにNull合体演算子と優先順位をマスターしているので、このままそっとブラウザバックしてください。

なぜ 0 と表示されるのか

至極単純な理由で?:+より優先順位が低いためtmp1 ?: 0 + tmp2tmp1 ?: (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と表示されます。

あとがき

あまりにも初歩的なミスですが、だからこそミスに気づきにくいと思います。
私のような犠牲者が再び出ないように戒めの意を込めて書きました。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0