黑马程序员技术交流社区

标题: 下面的输出结果为什么是67? [打印本页]

作者: tansuozhey    时间: 2015-11-24 19:05
标题: 下面的输出结果为什么是67?
int  num = 60;
int  n1 = num&15;
System.out.println((n1>9)?((char)(n1-10+'A')):n1);
作者: 你是对的    时间: 2015-11-24 20:11
60&15等于12   ture算左边   67   但是我也不知为啥没强转
等大神来吧

作者: hrfhwy    时间: 2015-11-24 23:26
ni=12,大于9,读(char)(n1-10+'A'),得到实质,
作者: hrfhwy    时间: 2015-11-24 23:28
ni=12,大于9,读(char)(n1-10+'A'),得到‘C',和比较后提升为int,所以是67
作者: tansuozhey    时间: 2015-11-25 08:53
hrfhwy 发表于 2015-11-24 23:28
ni=12,大于9,读(char)(n1-10+'A'),得到‘C',和比较后提升为int,所以是67

”和比较后提升为int,所以是67“,这句什么意思,要和谁比较?
作者: hrfhwy    时间: 2015-11-25 20:36
tansuozhey 发表于 2015-11-25 08:53
”和比较后提升为int,所以是67“,这句什么意思,要和谁比较?

冒号前后是一个类型,所以char型的‘C',提升为int型的67
作者: 873350610    时间: 2015-11-25 21:46
顶一个
作者: 王际涛    时间: 2015-11-26 00:19
char自动提升为int类型,因为n1是int 类型
作者: tansuozhey    时间: 2015-11-26 08:34
王际涛 发表于 2015-11-26 00:19
char自动提升为int类型,因为n1是int 类型

应该是这样,但是个人认为java的这个语法挺奇怪的!
作者: tansuozhey    时间: 2015-11-26 08:36
谢谢各位!
作者: wqd123    时间: 2015-11-26 12:28
&不是与吗?怎么跑到运算里来了
作者: DaYe    时间: 2015-11-26 12:50
60和15与运算就等于12(111100与001110结果为001100)
作者: TG·小强    时间: 2015-11-26 15:44
我是这样理解的。
考察了两点:
① 数据类型自动提升
② 运算符的优先级
   这个跟运算符的优先级有关,“?:”是种运算符,而(char)在运算符之前就已经运算完了,一段时间内确实先转化成了“C",但在运算过程中运算符”?:“遇到了n1(n1参与了运算(判断)),这是被又被提升为int了。
转化过程:
(n1>9)?((char)(n1-10+'A')):n1
= true?(‘C’:12)
= 67   
如果这样写(char)((n1>9)?((char)(n1-10+'A')):n1 )结果就应该是‘C’(这个我没试过,如果语法没错应该没问题)。

作者: fsociety    时间: 2015-11-26 16:45
类型强制转换了
作者: feige5257    时间: 2015-11-26 16:56
强制转换类型
作者: Myth、骞    时间: 2015-11-26 17:56
public class Test1 {
        public static void main(String[] args) {
                int num = 60;
                int n1 = num & 15;
                System.out.println((n1 > 9) ? ((char) (n1 - 10 + 'A')) : 2);
                System.out.println((n1 > 9) ? ((char) (n1 - 10 + 'A')) : "2");
        }
}

打印出来都是C
why?

作者: yuhongzhen    时间: 2015-11-26 20:25
num&15;这是位运算,60换成二进制是111100,15换成二进制是001111,运算结果是001100换成十进制是12,'A'是65,于是System.out.println((12>9)?((char)(12-10+65)):12);结果就是67了
作者: TG·小强    时间: 2015-11-26 20:33
Myth、骞 发表于 2015-11-26 17:56
public class Test1 {
        public static void main(String[] args) {
                int num = 60;

三元运算符比较特殊吧。 系统根本不知道你输入的2整型的,这个2可能是字符型的值,所以系统可能默认为是字符型了。(这个我是这么理解的啊!)
作者: TG·小强    时间: 2015-11-26 20:34
yuhongzhen 发表于 2015-11-26 20:25
num&15;这是位运算,60换成二进制是111100,15换成二进制是001111,运算结果是001100换成十进制是12,'A' ...

我觉得最重要的是告诉了12是int型了
作者: 13277988289    时间: 2015-11-26 21:25
如果在整个输入内容的前面加上(char)结果应该就是‘C’
作者: 小布丁当    时间: 2015-11-26 21:38
赞一个!!!!!!
作者: 小笨笨天    时间: 2015-11-26 21:46
原来冒号前后类型是一直的  学习了




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