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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沐有鱼丸 中级黑马   /  2013-7-23 10:46  /  1415 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-24 21:07 编辑

public class Test{
public static void main(String[] args){  
char x = 'X';
int i = 0;
System.out.print(true ? x : 0);
System.out.print(false ? i : x);  
}
}
为什么打印的是:X88,而不是XX,请大家指点一下。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
在下面的语句中,x取得类型依赖于另一个参数的类型。如果是字面值的int类型,那么x还是原来的类型,该int类型转换为char类型。如果是字面值short,byte等除boolean以为的基本类型,x要转成这些类型。如果是int变量类型,那么x转换为int类型。代码如下:
public class Test1 {
public static void main(String[] args)
{
        char x= 'X';
        int i = 0;
       
        System.out.println(true ? x : 0);
        System.out.println(true ? 0 : x);
        System.out.println(false ? x : 0);
        System.out.println(false ? 0 : x);
       
        System.out.println(true ? x : i);
        System.out.println(true ? i : x);
        System.out.println(false ? x : i);
        System.out.println(false ? i : x);       
}
}

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张yy 于 2013-7-23 11:38 编辑

首先回答这两个的区别
System.out.print  这个是输出后不换行
System.out.println 这个输出后要换行
但为什么前一个输出的是X后一个输出的是数字,这个要看输出的是什么内容了。
因为你这两个输出里面都是一个表达式,print是根据计算的结果来进行输出的,对于你这道题
true ? x : 0 的问号后第一个参数是字符型的,所以直接输出了X
false ? i : x  的问号后的第一个参数是整形,所以会按整形来输出所以输出了X的asc码也就是88
如果你想输出得到XX的话,把X的char转换成String类型就可以了:

public class Test3 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String x = "X";
                int i = 0;
                System.out.print(true?x:0);
                System.out.print(false?i:x);
        }

}

输出:XX

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
在程序的两个条件表达式中,一个操作数的类型是char,另一个的类型是 int。在两个表达式中,int 操作数都是 0,它可以被表示成一个 char。然而,只有第一个表达式中的 int 操作数是常量(0),而第二个表达式中的 int 操作数是变量(i)。因此,第 2 点被应用到了第一个表达式上,它返回的类型是 char,而第 3 点被应用到了第二个表达式上,其返回的类型是对 int 和 char 运用了二进制数字提升之后的类型,即 int。  条件表达式的类型将确定哪一个重载的 print 方法将被调用。对第一个表达式来说,PrintStream.print(char)将被调用,而对第二个表达式来说,PrintStream.print(int)将被调用。前一个重载方法将变量 x 的值作为 Unicode字符(X)来打印,而后一个重载方法将其作为一个十进制整数(88)来打印。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
简单的说就是自动类型提升,System.out.print(false?i:x);这句因为i是整型,所以自动把x把替换成整型的ASCII码,所以打印出来的是88,前面就不用解释了。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
确定条件表达式结果类型的规则过于冗长和复杂,很难完全记住它们,但是其核
心就是一下三点:
1、 如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。
2、如果一个操作数的类型是T,T 表示byte、short 或char,而另一个操作数是一个int 类型的常量表达式,它的值是可以用类型T 表示的,那么条件表达式的类型就是T。
3、否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
xscn 高级黑马 2013-7-23 13:30:31
7#
如果是char和int字面值,结果为char类型‘
如果char和int型变量,结果提升为int型
  1. public class Testx {
  2. public static void main(String[] args)
  3. {
  4.         char x= 'X';
  5.         int i = 97;
  6.       
  7.         System.out.println(true ? x : i);
  8.         System.out.println(true ? i : x);
  9.         System.out.println(false ? x : i);
  10.         System.out.println(false ? i : x);
  11.       
  12.         System.out.println(true ? x : 97);
  13.         System.out.println(true ? 97 : x);
  14.         System.out.println(false ? x : 97);
  15.         System.out.println(false ? 97 : x);      
  16. }
  17. }
复制代码
结果是88 97 97 88 X a a X

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
是类型自动转换啊,i是整形,就把X的char形转化为int,用的是ASCII码转换的  ‘X’-----88
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马