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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 宋玉 中级黑马   /  2013-12-16 11:27  /  1526 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 宋玉 于 2013-12-16 15:57 编辑

为什么      System.out.println(n1>9?(char)(n1-10+'A'):n1);
这个输出语句是67,而不是C呢?
我想得到的结果是
C
3
而输出的结果是
67
3
到底问题出在哪里呢?



class Demo
{
        public static void main(String[] args)
        {
                int num = 60;
                int n1=num&15;
                System.out.println(n1>9?(char)(n1-10+'A'):n1);
                int temp = num>>>4;
                int n2=temp&15;
                System.out.println(n2>9?(char)((n2-10)+'A'):n2);
        }
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
要计算n1>9?(char)(n1-10+'A'):n1,先分开计算n1>9,(char)(n1-10+'A')和n1。n1>9返回true,问题出在(char)(n1-10+'A')和n1属于不同数据类型。前者属于char类型,后者属于int类型。三目运算符冒号左右的两个式子要求数据类型相同,这时char类型就会被自动转换成int类型,char类型的‘C'就变成了ASCII码值67。最后计算整个三目运算,返回67。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 豆晨阳 于 2013-12-16 13:37 编辑

Java三目运算符(boolean?表达式1:表达式2)
(1)假如表达式1和表达式2具有相同的类型,那么整个条件运算符结果的类型就是这个类型。
   (2)假如一个表达式的类型是T,T是byte或short或char,另一个表达式的类型是int类型的常量表达式,而且这个常量表达式的值是可以用类型T表示的(也就是说,常量表达式的值是在类型T的取值范围之内),那么整个条件运算符结果的类型就是T。
    (3)除以上情况外,假如表达式1和表达式2的类型不同,那么将进行类型提升,整个条件运算符结果的类型就是提升后的类型。     
     System.out.println(true?x:0);    //line3。
     表达式1是char类型,表达式2是int类型的常量表达式,而且这个常量表达式的值0可以用char类型来表示,因此整个条件运算符结果的类型就应当是char类型,所以输出的结果就是'A'。   
System.out.println(true?x:1111111110);    //line4。
表达式1是char类型,表达式2是int类型的常量表达式,但是这个常量表达式的值已经超出了char类型的取值范围,因此要进行类型提升,把char类型提升为int类型,整个条件运算符结果的类型就是int类型了,所以输出的结果是65(字符A的ASCII码)。   
System.out.println(false?i:x);    //line5。
表达式1是int类型的变量,表达式2是char类型的变量,没有常量表达式。因此要进行类型提升,把char类型提升为int类型,整个条件运算符结果的类型就是int类型。所以输出结果就是65。
对于你这道题可以这样改
class Demo
{
        public static void main(String[] args)
        {
                int num = 60;
                int n1=num&15;
                System.out.println(n1>9?(char)(n1-10+'A'):  (char)n1);
                int temp = num>>>4;
                int n2=temp&15;
                System.out.println(n2>9?(char)((n2-10)+'A'):n2);
        }
}
回复 使用道具 举报
这个多简单啊
你这样不就行了
public class test20131216 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                  int num = 60;
          int n1=num&15;
          System.out.println((char)(n1>9?(n1-10+'A'):n1));
          int temp = num>>>4;
          int n2=temp&15;
          System.out.println(n2>9?(char)((n2-10)+'A'):n2);
        }

}
强转的位置挪一下,而且建议你在真值运算的时候还是用十六进制看着比较舒服,一目了然
回复 使用道具 举报
回音 发表于 2013-12-16 12:02
要计算n1>9?(char)(n1-10+'A'):n1,先分开计算n1>9,(char)(n1-10+'A')和n1。n1>9返回true,问题出在(char) ...

非常感谢,我明白了
回复 使用道具 举报
豆晨阳 发表于 2013-12-16 13:35
Java三目运算符(boolean?表达式1:表达式2)
(1)假如表达式1和表达式2具有相同的类型,那么整个条件运算 ...

谢谢非常详细的为我解答。
最后你写的System.out.println(n1>9?(char)(n1-10+'A'):  (char)n1);有点问题,于我的初衷不符。
我的初衷是  二进制转为十六进制的运算,n1的值大于9就输出数值对应的字符,n1的值小于9就直接输出得到的数字
回复 使用道具 举报
System.out.println(n1>9?(char)(n1-10+'A'):n1);    //问题就出在这里   你把冒号前面的强制转换成了
                                                                       //char  冒号后面的则是int类型    这里面类型会自
                                                                     //动提升为int类型
这个输出语句是67,而不是C呢?
我想得到的结果是
C
3
而输出的结果是
67
3
到底问题出在哪里呢?



class Demo
{
        public static void main(String[] args)
        {
                int num = 60;
                int n1=num&15;
                System.out.println(n1>9?(char)(n1-10+'A'):n1);
                int temp = num>>>4;
                int n2=temp&15;
                System.out.println(n2>9?(char)((n2-10)+'A'):n2);
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马