【java解惑】条件式結果タイプ規則


次のコードがあります.
public class Example008 {
	public static void main(String[] args) {
		char x = 'X';
		int i = 0;
		System.out.println(true ? x : 65535); //1
		System.out.println(true ? x : 65536); //2
		System.out.println(true ? x : i); //3
		System.out.println(false ? 0 : x);//4
		System.out.println(false ? i : x);//5
	}
}

出力結果:
X
88
88
X
88

原因分析:
この結果に対して,条件式の結果タイプ規則を理解しなければ,驚くに違いない.条件式の出力結果タイプルールは、次の3つにまとめられます.
  • は、2番目と3番目のオペランドが同じタイプである場合、条件式のタイプである.言い換えれば、ハイブリッドタイプの計算を迂回することで、煩わしさを避けることができます.
  • あるオペランドのタイプがTである場合、Tはbyte、shortまたはcharを表し、もう一つのオペランドはintタイプの定数式であり、その値はタイプTで表すことができ、条件式のタイプはTである.
  • それ以外の場合、オペランドタイプにはバイナリ数値リフトが適用され、条件式のタイプは、2番目と3番目のオペランドがリフトされた後のタイプである.

  • 上記のルールを理解したら、コードを再分析します.
  • 出力1では、65535はcharで表すことができる(javaではcharが2バイトを占める)ので、ルール2に合致し、出力タイプはcharである.
  • は2を出力し、65536はintタイプの定数であるが、charを使用して表すことはできず、charはjavaで最大65535しか表すことができない.したがって、ルール3に合致し、出力タイプは昇格後のタイプ、intである.
  • は3を出力し、iはintタイプの値であるが、iは定数ではなく変数であるため、依然として規則3に合致し、出力タイプはintである.
  • 出力4、ルール2に合致し、出力タイプはcharである.
  • は5を出力し、ルール3に合致するので、出力タイプはintである.

  • これで出力結果が一目瞭然です.
    (注:本【java解惑】シリーズは、いずれもブロガーが『java解惑』原書を読んだ後、原書の説明と例の部分を改編し、ブロガーに書いて発表したものである.すべての例は自らテストに合格し、githubに共有されている.これらの例を通じて、自分を励まし、他人に恩恵を与える.同時に、本シリーズのすべてのブロガーはブロガー個人の微信公衆番号(「愛題猿」または「ape_it」を検索する)に同期して発表される.みんなが読むのに便利です.もし文の中に原作者の権利を侵害する内容があれば、直ちにブロガーに知らせて、直ちに削除してください.読者が文の内容に異議や問題がある場合は、ブログの伝言や微信の公衆番号の伝言などを通じて共同で検討することを歓迎します.)
    ソースアドレス:https://github.com/rocwinger/java-disabuse
    本文は“winger”のブログから出て、転載をお断りします!