Dos Equis

2016 ワード

次のプログラムは何を印刷しますか?
1 public class DosEquis{ 

2  public static void main(String[]args){ 

3   char x= 'X'; 

4   int i = 0; 

5   System.out.println(true ? x :0); 

6   System.out.println(false ? i : x);

7   //System.out.println(false ? 0 : x); 

8  } 

9 } 


 
当たり前のようにX X
(変数iをデジタル出力に変換したのはX X)
でも実際はそうなの?答えは否定的で、彼が印刷したのはX 88です.
これは、ブレンドタイプの計算が混乱を引き起こすためであり、これは条件式で他のどこよりも明らかである.
条件式の結果タイプを決定するルールは冗長で複雑すぎて、完全に覚えにくいですが、その核心は次の3つです.
•2番目と3番目のオペランドが同じタイプの場合は、条件式のタイプです.言い換えれば、ハイブリッドタイプの計算を迂回することで、大きなトラブルを避けることができます.
•1つのオペランドのタイプがTで、Tがbyte、short、charを表し、もう1つのオペランドがintタイプの定数式で、その値がタイプTで表すことができる場合、条件式のタイプはTです.
•そうでない場合は、オペランドタイプに対してバイナリ数値を適用しますが、条件式のタイプは、2番目と3番目のオペランドが昇格した後のタイプです.
プログラムの2つの条件式では,1つのオペランドのタイプはcharであり,もう1つのタイプはintである.2つの式では、intオペランドはいずれも0であり、charとして表すことができる.しかしながら、第1の式のintオペランドのみが定数(0)であり、第2の式のintオペランドは変数(i)である.したがって、第2の点は第1の式に適用され、返されるタイプはcharであり、第3の点は第2の式に適用され、その返されるタイプはintとcharに対してバイナリ数値を用いて昇格したタイプ、すなわちintである.