小问题,难倒很多人

badboy169168 2010-01-04 04:59:01
public static void main(String[] args){
int i=4;
System.out.println("value is"+((i>4) ? 99.9 : 9)));
}




运行后打印的结果是:9.0


为什么???



...全文
1165 112 打赏 收藏 转发到动态 举报
写回复
用AI写文章
112 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxiaolei7676 2010-02-23
  • 打赏
  • 举报
回复
引用 27 楼 zewangdhlg1 的回复:
99.9默认是double型,而 9你定义的是int型,“99.9 : 9”,int型会自动转换成double型;如果反过来会报错,需要强制转换。比如:
public static void main(String[] args){
  double i=4.0;
  System.out.println("value is"+((i>4.0) ? 9 : (int)99.9)));
}

反过来也不会报错,9一样被转换成double型了,后面强制转换没有必要.
happybelladavid 2010-02-22
  • 打赏
  • 举报
回复
这就是隐式转换。自动转型了。
bobo364 2010-02-22
  • 打赏
  • 举报
回复
学习了 呵呵 还真不知道这个
hovei 2010-02-22
  • 打赏
  • 举报
回复
引用楼主 badboy169168 的回复:
public static void main(String[] args){
int i=4;
System.out.println("value is"+((i>4) ? 99.9 : 9)));
}


运行后打印的结果是:9.0


为什么???



这是个类型自动提升的问题,也就是隐性类型转化,上面的三目表达式计算时最高类型是float型,int向float类型自动转化,所以计算出来的值为float类型。。
xxpp688 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 79 楼 ruoye_2008 的回复:]
引用 77 楼 xxpp688 的回复:
看来你没弄明白 隐式转换问题,还有三元用算符问题。
你要输出9的话
System.out.println("value is"+((i>4) ? 99.9 : (short)9)));
一下也可以


不对吧,换成short,它还是会转成double的,所以输入仍然是9.0
[/Quote]
不好意思,太急写错了
改正一下: int i=4;
System.out.println("value is"+(short)((i>4) ? 99.9 :9));
asdf666 2010-02-01
  • 打赏
  • 举报
回复
操作数的数据类型不一致,会自动将类型小的数提升到操作数中类型最大的数
plplum 2010-02-01
  • 打赏
  • 举报
回复
很简单的啊:隐式类型转换
rempolee 2010-01-26
  • 打赏
  • 举报
回复
]知道那些类型可以隐士转换
better11 2010-01-26
  • 打赏
  • 举报
回复
楼上的都说了,隐式类型转换
angel243fly 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 kingwolfofsky 的回复:]
《Java编程规范》
对于条件表达式
1、如果第二和第三个操作数有相同的类型,那么这个类型就是条件表达式的类型
2、如果一个操作数的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的常量表达式,它的值是可以用类型T表示的,那么条件表达式的类型就是T。
3、否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。
[/Quote]
kingwolfofsky的回答最到位
o_range 2010-01-25
  • 打赏
  • 举报
回复
路过
wangxiaoyi2 2010-01-25
  • 打赏
  • 举报
回复
路过 学习了
Forrest23 2010-01-25
  • 打赏
  • 举报
回复

System.out.println("values is "+((i>4)? 98:99));
//改成这样就输出99了
susie0136 2010-01-25
  • 打赏
  • 举报
回复
learnt
nicai00 2010-01-25
  • 打赏
  • 举报
回复
学习了学习了学习了
mouer 2010-01-25
  • 打赏
  • 举报
回复
public static void main(java.lang.String[]) throws java.lang.Exception;
Signature: ([Ljava/lang/String;)V
Code:
0: iconst_4
1: istore_1
2: getstatic #19; //Field java/lang/System.out:Ljava/io/PrintStream;
5: new #25; //class java/lang/StringBuilder
8: dup
9: ldc #27; //String value is
11: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
14: iload_1
15: iconst_4
16: if_icmple 25
19: ldc2_w #32; //double 99.9d
22: goto 28
25: ldc2_w #34; //double 9.0d
28: invokevirtual #36; //Method java/lang/StringBuilder.append:(D)Ljava/lang/StringBuilder;
31: invokevirtual #40; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
34: invokevirtual #44; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
37: return
如果变为:
System.out.println("value is "+((i>4) ? 9: 7.0f));

19: ldc #32; //float 9.0f
21: goto 26
24: ldc #33; //float 7.0f

总结:
JVM把 9: 7.0f 当成一个符号来处理,复合java的向上转型.
over
IToneY 2010-01-25
  • 打赏
  • 举报
回复
这个问题确实值得学习哈!!
wangwffgqeg 2010-01-25
  • 打赏
  • 举报
回复
路过
xsj__2006 2010-01-25
  • 打赏
  • 举报
回复
这个问题值得注意。。。
geolisa 2010-01-25
  • 打赏
  • 举报
回复
学习了 呵呵 还真不知道这个
加载更多回复(92)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧