黑马程序员技术交流社区

标题: 一个关于字符强制转换的问题,大神进 [打印本页]

作者: 黑马-谭皓    时间: 2012-4-16 14:33
标题: 一个关于字符强制转换的问题,大神进
为什么执行下面代码得到的十进制数而不是字符A, B, C....
  1. int num = 60;
  2.                 int n1 = num &15;
  3.                 System.out.println(n1>9?(char)(n1-10+'A'):n1);
  4.                 System.out.println(n1);
  5.                
  6.                 int temp = num >>>4 ;
  7.                
  8.                 int n2 = temp &15;
  9.                 System.out.println(n2>9?(char)(n2-10+'A'):n2);
复制代码
当num=60时得到的是67  3并不是3C这是为什么?(第一次发帖,见谅啦)

123.jpg (44.18 KB, 下载次数: 93)

123.jpg

作者: 岳民喜    时间: 2012-4-16 15:29
因为  System.out.println(n1>9?(char)(n1-10+'A'):n1);中的 n1是int型的,前面的char类型会有类型提升, 所以输出是67 不是C ,
详细可以查阅三元运算符的元素类型描述。

而int temp = num >>>4 ;运行后temp值是3
     int n2 = temp &15;//执行后还是3
   System.out.println(n2>9?(char)(n2-10+'A'):n2);  因为n2>9不满足,所以输出n2, 结果是3是正确的  
作者: 葛尧    时间: 2012-4-16 15:49
三目运算符,属于运算符,要让字符参与运算,会有类型提升,返回的结果也必然是一致的。 所以你在(char)(n1-10+'A')这里强转,还会被转回来。。。
要想让结果变,就只能把整个表达式的结果强转一下了(char)(n1>9?(n1-10+'A'):n1);
如果你非要让结果打印C或者 n1的十进制,就只能用if了吧,毕竟三目运算符是有局限性的

当然这些只是我的理解,不一定就合理
作者: 黑马-谭皓    时间: 2012-4-17 15:28
好的~谢谢上面两位了!我再看看~




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