A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡宝林 中级黑马   /  2012-6-6 19:02  /  1359 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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,求解!!!!

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 刘伯阳 于 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。

回复 使用道具 举报
这个问题牵涉到三目运算符和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: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。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
这个是隐式转换问题,隐式转换肯定要朝大类型或是精度高的转换,int占的字节大于char,两个又在同一条语句里面,肯定要朝int转换啊!
同理,如果改成
int x = 1;
short b = 2;
System.out.println(true ? b : x);
这个打印出来的肯定是int类型!你可以测试一下…
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马