黑马程序员技术交流社区

标题: 三目运算符?? [打印本页]

作者: Dej@vu    时间: 2013-8-9 12:57
标题: 三目运算符??
  1. public static void main(String []args){
  2.         char x = 'E';
  3.         int i = 0;
  4.         System.out.println(true ? x:0);//1
  5.         System.out.println(false? i:x);//2

  6. }
复制代码
为什么输出结果是 E 和 69
2--》三目运算符不是判断条件为假则输出 x 的值吗??为什么还要进行数据类型转换?
求讲解??谢谢
作者: longlangcx    时间: 2013-8-9 13:52
你也说了,这是一种运算符,由运算符组成的表达式的值需要再编译期确定其类型。而两种不同的数据类型进行运算就涉及到了类型转换问题。就好比一个char ch = 'E' + -1;会出现编译错误一样。

第一个输出E是因为x:0中的0是一个直接常量,而0-65535之间的直接常量是可以直接当做char来用的。因为他是一个编译时常量,在编译时就可以确定值。因此运算结果的类型为char。
第二个输出69是因为i:x中的i是一个变量而不是一个编译期常量,因此只能用其声明类型int,而char与int的运算结果是int。
作者: binghaiwang    时间: 2013-8-9 14:01
第一个  因为你的条件是true  结果中你是拿一个变量跟一个常量在比较 所以  类型不会转变 是 E
第二个输出结果变成数字  是因为 数据类型隐式转换,系统会自动将存储单元空间少的类型提升到存储单元空间多的类型 , 以保证运算精度的准确性
如果你要输出E 你要 这样(char)i:x即可

作者: 赵国刚    时间: 2013-8-9 18:03
E 的assic编码是69,你比的是类型转意了
作者: 封号了...    时间: 2013-8-10 02:16
longlangcx 发表于 2013-8-9 13:52
你也说了,这是一种运算符,由运算符组成的表达式的值需要再编译期确定其类型。而两种不同的数据类型进行运 ...

楼上正解:定义i变量的时候加个final,结果就都是E了!
果然是第一个因为是编译时是常量然后直接当做char,第二个是运行时才赋值,然后int跟char类型运算自动向上转型为int类型!
给力!!:handshake




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