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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class OperateDemo3
{
        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);



               
        }
}

为什么  
System.out.println((n1>9)?(char)(n1-10+'A'):n1);
打印出来的不是C 而是67呢?

4 个回复

倒序浏览
注意System.out.println((n1>9)?(char)(n1-10+'A'):n1);
这句代码的意思,如果n1大雨9,就打印(n1-10+‘A’)并且转换成char即字符类型,打印出来的是字符,当然是c而不是67
回复 使用道具 举报
胡元 发表于 2012-3-7 13:30
注意System.out.println((n1>9)?(char)(n1-10+'A'):n1);
这句代码的意思,如果n1大雨9,就打印(n1-10+‘A ...

我也认为应该是C,可是试了一下确实是67,同迷惑中
回复 使用道具 举报
类似这样的问题 以前也有人问过。下面是 java 三元操作符的规则
(1)如果表达式1和表达式2具有相同的类型,那么整个条件运算符结果的类型就是这个类型。

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

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

上面的规则也许你不太明白 那么我来细细分析一下你的代码
System.out.println((n1>9)?(char)(n1-10+'A'):n1);
我们来吧 上面的代码拆成两行 应该真么写呢?
虽然看起来这是一个很简单事 但是 当你拆开的时候 问题就来了
? 后面的来个结果 是不同类型的 一个是 char ,一个是int?
为了兼容 int 和Char类型  那么接受 这个表达是的值的变量 就必须 兼容 char 和int 两种类型
所以拆开之后最少要写成这样
  1. int   timp = (n1>9)?(char)(n1-10+'A'):n1
  2. System.out.println(timp);
复制代码
上面的代码是 跟你写的那行代码等效的,也就是说 编译器做了判断 这个表达是的值 的类型至少是Int 型的,
你这句话 传入的 是一个Int型的变量。
因此 建议 不要为了 少敲几下键盘 而放弃代码的易读和简洁性。让人一看就明白的代码 才是号代码。{:soso_e100:}



  

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
System.out.println((char)(n1>9)?(n1-10+'A'):n1);这样写也可以,最终的结果强制转化成字符型。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马