黑马程序员技术交流社区

标题: 【出题啦】给大家出个题吧 [打印本页]

作者: 983859111    时间: 2016-2-25 11:34
标题: 【出题啦】给大家出个题吧
本帖最后由 983859111 于 2016-2-25 11:35 编辑
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 float num = 1500.00f;
  4.                 int a=(int)num;
  5.                 println(num);
  6.                 println(a);
  7.                 println(num==a);
  8.                 println(num == a ? a : num);
  9.         }

  10.         public static void println(Object arg0) {
  11.                 System.out.println(arg0);
  12.         }
  13. }
复制代码

请写出四行打印信息
给大家出个题,测试下大家的java基础知识,
答对了版主可能会给加分的哦…………(版主还不知道,加不加分他说了算。。。)



作者: JeromeLiee    时间: 2016-2-25 11:51
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 float num = 1500.00f;
  4.                 int a=(int)num;
  5.                 println(num);
  6.                 println(a);
  7.                 println(num==a);
  8.                 println(num == a ? a : num);
  9.         }

  10.         public static void println(Object arg0) {
  11.                 System.out.println(arg0);
  12.         }
  13. }
复制代码


我得出的结果是:
1500.00
1500
true
1500
jvm给的是:
1500.0
1500
true
1500.0
有点不太明白了
求解释
作者: 曾宇    时间: 2016-2-25 12:28
JeromeLiee 发表于 2016-2-25 11:51
我得出的结果是:
1500.00
1500

最后问的是。num等于a吗?
==比较的是内存地址值。
一个float,一个int。这两个存储的地址会相同吗?
不相同的话,输出num。
作者: JeromeLiee    时间: 2016-2-25 12:49
曾宇 发表于 2016-2-25 12:28
最后问的是。num等于a吗?
==比较的是内存地址值。
一个float,一个int。这两个存储的地址会相同吗?

==比的是地址值,那么println(num == a)如果是true的话,那么最后一个打印的应该是a啊,也就是1500。还有num的值打印怎么不是1500.00,而是1500.0,小数点后只有一个0?
作者: 15266913109    时间: 2016-2-25 12:58
哈哈,帮顶
作者: 983859111    时间: 2016-2-25 13:38
曾宇 发表于 2016-2-25 12:28
最后问的是。num等于a吗?
==比较的是内存地址值。
一个float,一个int。这两个存储的地址会相同吗?

那请解释下第三行  a==num  输出true 的原因
作者: 曾宇    时间: 2016-2-25 14:24
983859111 发表于 2016-2-25 13:38
那请解释下第三行  a==num  输出true 的原因

是我错了,误导人了
第三行,a==num,比较的是内存地址值。内存地址内指向常量池,值相等的情况下,常量池地址相等。所以是true。
第四行,num == a ? a : num,num是a么?是输出a,不是输出num。所以输出num
作者: 曾宇    时间: 2016-2-25 14:28
本帖最后由 曾宇 于 2016-2-25 14:44 编辑
983859111 发表于 2016-2-25 13:38
那请解释下第三行  a==num  输出true 的原因

是我错了,误导人了
第三行,a==num,比较的是内存地址值。内存地址内指向常量池,值相等的情况下,常量池地址相等。所以是true。
第四行,num == a ? a : num。输出的结果是a。两个值做比较的时候,会自动向高精度转型。所以输出1500.0


作者: 参禅悟道    时间: 2016-2-25 14:28
本帖最后由 参禅悟道 于 2016-2-25 14:39 编辑

抛开楼主的代码,你们打印一下这句代码:
System.out.println(true ? 1 : 2.0);
结果是:1.0我想应该是在进行int和float比较的时候,先把int类型的数据转换成了float类型的也就是:System.out.println(true ? 1.0 : 2.0);
所以打印出结果的时候是1.0
至于上面有人说==比较的是内存地址,这句话并没有错,但是a==num确实返回true,所以三元表达式num == a ? a : num确实打印的是a,只不过这个时候的a已经转换成float类型了。具体我也不是很清楚就不多做评论了
不知道我这样的解释对不对。


作者: 983859111    时间: 2016-2-25 15:17
曾宇 发表于 2016-2-25 14:28
是我错了,误导人了
第三行,a==num,比较的是内存地址值。内存地址内指向常量池,值相等的情况下,常量池 ...

三元操作符必须返回同一个数据,而且类型要确定,不可能条件为真返回int类型,条件为假返回float类型,编译器是不会允许的,所以进行类型转换了。
作者: 苍山雪    时间: 2016-2-25 23:05
给个具体说明
作者: 983859111    时间: 2016-2-26 09:50
楼上的诸位其实都已经回答对了,我给大家总结下:
  1. class TernaryOperation {
  2.         public static String s1 = "数据1";
  3.         public static String s2 = "数据2";
  4.         public static String result;

  5.         public static void main(String[] args) {
  6.                 // if方法带回的返回值
  7.                 result = ternaryOperation();
  8.                 // 三元运算
  9.                 result = (s1.equals(s2) ? "正确" : "错误");

  10.         }

  11.         public static String ternaryOperation() {
  12.                 if (s1.equals(s2)) {
  13.                         return "正确";
  14.                 } else {
  15.                         return "错误";
  16.                 }
  17.         }
  18. }
复制代码

三元运算其实可以看成本质是一个带返回值的if判断方法;
所以,方法的返回值必须要明确一个类型;三元运算的a==b?c:d 中 c、d就相当于if、else的两个返回值,应该是有默认的返回值类型;
所以,才会有出现转型;或者是返回父类对象的情况。





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