2014/07/08

quiz

public static void main(String[] args) {
     int _=0;
     _ = _+++_+++_ ;
     System.out.println(_);
}
上記コードの実行結果はどうなるか。
  • 2が表示される
  • 3が表示される
  • 4が表示される
  • コンパイルエラーで実行出来ない

こんなのはOCJ-Pで出ないと思うが、何かの問題で見た気がする。
選択肢がこの4つだとかなり悩むと思う(特にコンパイルエラーで)。
実際のOCJ-Pでも「コンパイルエラーになる」、という選択肢に随分悩まされた。

「_」は普通に有効な変数名。まぁ読み難くするだけなので「i」で置き換える。
「i+++i+++i」と同じこと(それでも読み難いが)、これを左から一文字ずつ見るので
「(i++) + (i++) + i」 という計算だろう。
「(i++)」の時点では「0」。その後「0+(i++)」の計算前に最初のインクリメントが効いて iは1 になっている。
「0+1」。そのあと、「0+1+i」の計算前に2つ目のインクリメントが効いて iは2 になり、
「0+1+2」、が計算結果となる。つまり「3が表示される」。
(ほんとかな??)

ちなみに「i+++i」がコンパイルエラーじゃないってのは左から一文字ずつ見て一意に決まるからか?。
「i++ + ++i」のつもりで書いた「i+++++i」はコンパイルエラーになった。左から見ていくと「+」が4つになるからか?
マイナスを混ぜて「i++-++i」だとコンパイル、実行出来た。

0 件のコメント:

コメントを投稿