黑马程序员技术交流社区

标题: [已解决]请教一个问题 [打印本页]

作者: 胡宝林    时间: 2012-6-6 19:02
标题: [已解决]请教一个问题
本帖最后由 hy19985125 于 2012-6-6 21:12 编辑

public class D{
        public static void main(String[] args){
                char x = 'a';
                int a = 0;
                System.out.println(true ? x : 0);
                System.out.println(false ? a : x);
        }
}
//第一个三元表达式打印x,第二个三元表达式打印的也是x,程序本该打印两个a
//但是却打印了a 97,求解!!!!
作者: 刘伯阳    时间: 2012-6-6 19:09
本帖最后由 刘伯阳 于 2012-6-6 19:39 编辑

请注意在这两个表达式中,每一个表达式的第二个和第三个操作数的类型都不相同:x是char类型的,而0和a都是int类型的。
混合类型的计算在三元表达式中会“引起混乱”
1、如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。换句话说,你可以通过绕过混合类型的计算来避免大麻烦。
2、如果一个操作数的类型是byte、short或char类型的,而另一个操作数是一个int类型的常量表达式,它的值是可以用byte、short或char类型表示的,那么条件表达式的类型就是byte、short或char。
3、否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。

所以第一行:  0被看作是char类型,所以x不必转换,输出a。
第二行:a是int类型,x是char型,x需要被强制转成int,a在ASCII码中对应的是97,输出97。


作者: 李春阳    时间: 2012-6-6 19:32
这个问题牵涉到三目运算符和java运算的自动转换。

分析下:
你这里的
a为int类型
x为char类型
第一行计算x和0,
  此时0可以被看作是char类型,所以x并没有被转换,而是直接输出a

第二行计算a和x,
  这里a是int类型(且无法转为char型),而x是char型,所以对于不同的基础型,
此时x需要被强制转成int之后再运算,a也就是对应97啦~

所以最后的结果就是:
a
97

作者: 吴小铁你好    时间: 2012-6-6 19:51
本帖最后由 吴小铁你好 于 2012-6-6 19:56 编辑

楼主这个问题提的好,如果代码是这样的就能得到a a了。
  1. package zhangxiao;

  2. public class D{
  3.     public static void main(String[] args){
  4.             char x = 'a';
  5.             int a = 0;
  6.             System.out.println(true ? x : 0);
  7.             System.out.println(false ? 0 : x);
  8.             
  9.            /* System.out.println(x);
  10.             System.out.println(a); */
  11.             
  12.     }
  13. }
复制代码
实质上这就是条件运算符对于运算结果类型的限制:

(1)假如表达式1和表达式2具有相同的类型,那么整个条件运算符结果的类型就是这个类型。

(2)假如一个表达式的类型是T,T是byte或short或char,另一个表达式的类型是int类型的常量表达式,而且这个常量表达式的值是可以用类型T表示的(也就是说,常量表达式的值是在类型T的取值范围之内),那么整个条件运算符结果的类型就是T。

(3)除以上情况外,假如表达式1和表达式2的类型不同,那么将进行类型提升,整个条件运算符结果的类型就是提升后的类型。

    System.out.println(true?x:0);    表达式1是char类型,表达式2是int类型的常量表达式,而且这个常量表达式的值0可以用char类型来表示,因此整个条件运算符结果的类型就应当是char类型,所以输出的结果就是'A'。

       System.out.println(false?a:x);    表达式1是int类型的变量,表达式2是char类型的变量,没有常量表达式。因此要进行类型提升,把char类型提升为int类型,整个条件运算符结果的类型就是int类型。所以输出结果就是97。
作者: cro    时间: 2012-6-6 20:16
这个是隐式转换问题,隐式转换肯定要朝大类型或是精度高的转换,int占的字节大于char,两个又在同一条语句里面,肯定要朝int转换啊!
同理,如果改成
int x = 1;
short b = 2;
System.out.println(true ? b : x);
这个打印出来的肯定是int类型!你可以测试一下…




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2