public class T {
  public static void main(String[] args) {
    int i = 0;
    System.out.println(false ? i : 'b');
    System.out.println(false ? 10 : 'b');
  }
}这个代码是我在看另一个人发的帖子里面的代码以后再重新写的,
我本以为执行效果一样,但发现我错了,
输出结果为:
98
b提问:为什么第一种情况对'b'进行转换,而第二种情况不进行转换?请高手指点。

解决方案 »

  1.   

    个人理解:可能跟i是int型有关。
    可以将10改为10L看看,输出的也是98。
      

  2.   

    1.如果表达式2和表达式3类型一样,则返回类型与它们一样;
    2.如果表达式2或表达式3类型为btye,short或char,而另一表达式类型为int且却是byte,short或char的形式,则返回类型为byte,short或char;
    3.情况1,2都不符合,则返回表达式2,3的较高提升类型第一条语句中i是int型,所以返回提升类型int
    第二条语句中10可以认为是char型,所以返回char类型的'b'
      

  3.   


    public class T {
        public static void main(String[] args) {
            int i = 0; 
            System.out.println(false ? i : 'b');  //这里返回的是char型'b'对应的ASC码
             System.out.println(false ? 10 : 'b'); //返回的是char型'b'
        }
    }
      

  4.   


    多谢回复,
    但在默认情况下 编译器应该把10当作 int 类型阿,怎能认为 char 类型呢?
    难道还有什么其他的说道吗?
      

  5.   

    是啊,10应该被默认为int型的啊,怎么回事呢
      

  6.   

    这个确实是个疑问,但我更倾向于认为在这里10不是int类型
      

  7.   

        System.out.println(false ? i : 'b'); 
        System.out.println(false ? 10 : 'b'); 
      i为 int 型, 10 也为int 型,但 i 为 变量 , 10 为 常量 ,所以就有区别了
      

  8.   


    public class T { 
       public static void main(String[] args) { 
          final int i = 0; 
          System.out.println(false ? i : 'b'); 
          System.out.println(false ? 10 : 'b'); 
       } 
    }这样真的输出是:
    b
    b
      

  9.   

    当然不是类。只是按照规则,因为10虽然默认情况下编译器认为是int,但它也在char类型的范围呢,所以会返回值也是char类型。
    至于为什么加上final之后就打印b我现在也不太明白
      

  10.   

    public class T {
      public static void main(String[] args) {
          final int i = 0;
          System.out.println(false ? i : 'b');
          System.out.println(false ? 10 : 'b');
      }


    public class T {
      public static void main(String[] args) {
          final int i = 0;
          System.out.println(false ? 0 : 'b');
          System.out.println(false ? 10 : 'b');
      }

    编译出来的class文件是完全一样的。如果你能理解System.out.println(false ? 0 : 'b')会输出b,你就知道为什了。至于为什么这两种写法会生成一样的class文件,就是那个final惹得祸。