首页 > 试题广场 >

针对以下代码,哪些说法是正确的?

[不定项选择题]
针对以下代码,哪些选项执行后是true的:()
class CompareReference{
   public static void main(String [] args){
   float f=42.0f;
   float f1[]=new float[2];
   float f2[]=new float[2];
   float[] f3=f1;
   long x=42;
   f1[0]=42.0f;
  }
}
  • f1==f2
  • x==f1[0]
  • f1==f3
  • f2==f1[1]
推荐
BC正确,选项B解释,java核心卷I中43页有如下表述:两个数值进行二元操作时,会有如下的转换操作:
如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型。
否则,两个操作数都转换为int类型。
故,x==f1[0]中,x将会转换为float类型。
编辑于 2016-12-16 16:43:04 回复(42)
B选项:x == f1[0] ,x是long类型,与float类型对比属于低精度,所以x要向高精度的float类型转型再比较,故相等;
C选项:f1 == f3,f3没有new创建,而是由f1赋值,所以f3地址是指向f1的,f1值改变,相当于改变f3值,所以相等。
发表于 2017-02-15 17:34:19 回复(13)
yql头像 yql
 public static void main(String[] args){
        int i=42;
        double d=42.0000;
        long l=42;
        float f=42.0f;
        float f2=42.00f;
        System.out.println(d==i);
        System.out.println(f==i);
        System.out.println(f==f2);
        System.out.println(l==i);
        System.out.println(d==f);
    }
/*out:
true
true
true
true
true
*/
基本类型之间的比较,应该会将低精度类型自动转为高精度类型再比较。
发表于 2015-09-23 10:56:46 回复(4)
B、C f1、f2、f3是数组,是引用类型,f、x是基本类型。基本类型之间的比较,应该会将低精度类型自动转为高精度类型再比较,B选项是long和float比较,相当于long和long比较,所以B对。
发表于 2015-10-03 21:43:57 回复(9)
byte ,  short ,  int ,  long ,  fload ,  double
作比较的时候会自动向上转型, 向下转型的时候则需要强转!

所以选 B C
发表于 2016-08-31 22:40:47 回复(0)
x == f1[0] 是两个数值进行比较,数值间进行比较(二元操作)的时候,如果两边的数值类型不一样的话,则会向上转型。(int ->> long ->> float ->> double、char ->> int 、byte ->> int、 short ->> int)。在java中,数组也是一种对象,所以f3、f1都是对象的引用,第6行进行了赋值操作,所以,f1、f3是指向了同一对象的引用,f1 == f3所以返回true。
发表于 2016-05-15 17:45:44 回复(0)
基本类型之间比较值的大小。
发表于 2015-11-01 12:01:28 回复(0)
只有我在想java里浮点数能不能直接比较相等的问题吗...C和java的底层差别还是很大的啊
发表于 2017-07-24 22:00:35 回复(0)

"=="是关系运算符,当两个操作数进行比较时,转换关系如上图所示。float和double进行比较时,先转化为double,最后进行比较,亲测可行。备注:float f = 0.0f,double d = 0分别与int i = 0进行比较时,结果都为true。
编辑于 2017-07-25 09:47:28 回复(2)
"==" 在java中用来比较变量的值,对于引用类型变量,变量的值表示的是引用所指向的对象的内存地址,那么比较引用变量就表示判断这两个变量是否指向同一个对象。



编辑于 2017-02-20 10:17:23 回复(0)
对于A,地址不一样,但是地址指向内存值一样
发表于 2019-11-25 19:22:18 回复(0)

关于long转float

  • float是4个字节的,而long是8个字节的,数据的范围确实float大。
  • float转long需要强制类型转换,而long转float可以直接隐式转换。

原因在于:
  • float占的4个字节,也就是32位二进制中,1位是符号位,23位是尾数位,剩下的8位是指数位,8位代表0~255,根据IEEE 754规定,0代表0,255代表无穷大,剩下1~254,每个减去127,代表-126~127这个指数范围,也就是说float的幂级数大致范围是2的-126次幂到127次幂之间
  • long是8个字节,也就是64位,除去符号位,范围在只有2的63次幂,远远小于float。


编辑于 2019-03-18 09:53:59 回复(0)

选项A,错误,==比较在比较值得同时还比较二者的引用,着f1和f2是不同的对象,所以不会相等。
选项B,正确,Java自动类型提升, f1[0]会自动提升为long,所以正确。
选项C,正确,第6行,f3=f1,赋值,二者相等。
选项D,错误,理由同A。

发表于 2017-11-24 21:13:05 回复(0)
x == f1[0] 是两个数值进行比较,数值间进行比较(二元操作)的时候,如果两边的数值类型不一样的话,则会向上转型。(int ->> long ->> float ->> double、char ->> int 、byte ->> int、 short ->> int)。在java中,数组也是一种对象,所以f3、f1都是对象的引用,第6行进行了赋值操作,所以,f1、f3是指向了同一对象的引用,f1 == f3所以返回true。
发表于 2017-08-26 11:12:27 回复(1)
谁能解释下b
发表于 2015-10-02 22:21:36 回复(1)
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下: 
     低 ---------------------------------------------> 高 
  byte,short,char-> int -> long -> float -> double
选项B中,long型会向float型转换,再运算
发表于 2017-04-03 13:43:53 回复(0)
基本数据类型比较的是值,引用类型会隐式转换
发表于 2021-12-24 18:54:07 回复(0)
在java中高精度的自动向低精度转换。
发表于 2019-02-28 19:10:55 回复(0)
发表于 2018-06-25 20:00:58 回复(0)
debug出来的结果
编辑于 2017-11-27 09:34:14 回复(0)
数组的比较 数组是引用类型的 比较的是地址
发表于 2017-04-10 13:46:03 回复(0)