1、请问:下面表达式是true还是false?
double a = 0.8;
double b = 0.7;
double c = 0.6;
bool flag = (a-b) == (b-c);
是用纯数学思维去思考,a-b=0.1,b-c=0.1,两者是相等的,因为数学表述是最精确最严谨的。但是,物理元件上是用有限的64位存储位去存储double型的,存的是近似值。固定格式:1个sign位,11个阶码位,52个有效位。
我们再把这三个数的二进制形式转换出来(注意计算机用的是补码形式)
0.8=1100 1100 1100 1100.......无限循环...需要截断
0.7=10 1100 1100 1100............无限循环...需要截断
0.6=1001 1001 1001 1001 ....无限循环...需要截断
然后一直算到保留52位,然后你再算,你会发现,两者相减,误差相差3.1*10^(-16)。
所以:答案应该是false
2、请问:下面表达式是true还是false?
float a = 0.125f;
double b = 0.125;
bool flag1 = 0==(a-b) ;
bool flag2 = 0.0==(a-b) ;
由于受到上面题目的迷惑,所以这一题一下子就在true和false摇摆不定了。特别这里一个是float,一个是double,float固定格式是1位sign+8位阶码位,23个有效位。
其实,万变不离其宗,看二进制。
0.125=(0.001)B,有限不循环数,它是精确数,而不是近似值。
(0.001)B-(0.001)B=(0.00)B,也是精确值。
而且,0.0与0,所有存储位也全部都是0.
所以,这两个表达式,其实都是true。
3、表达式 1.0/0,请问下面结果应该选择谁?
A: 编译出错,0不能做分母, B: Infinity C: NAN(Not a number)
不同语言不同编译器的实现细节不一样,如果是C++语言用微软的msvc的编译器,编译时就会报错,提示被零除或被零取模。如果是java语言用javac编译器编译通过的,而且定义:浮点数运算时,当分母为0时只要分子不为0,结果均为无穷,分子为0时结果均为NAN。整数运算时,分母不能为0否则抛出算术异常。
所以,如果当C/C++时,答案选A, 如果是java,答案选B
3、请问下面调用,应该选择谁?
[JAVA]void f(String s){} 或者 [JAVA]void f(char *s){}
void f(Integer i){}
调用:f(null);
A: 前者, B 后者 C 报错
首先要明白null的定义,0,或(void*)0,
注意它们的区别:值0,地址0
而上述既可以看成是空字符串,也可以看成是整数0,所以出现混淆。所以才有了C++11之后新增加的nullptr空指针,用于区分。
所以答案应该是C,报错。
4、JAVA语言下,请问下面调用,是应该调用哪个?
void g (Integer i){}
void g (double i){}
调用: g(1);
A: 前者, B 后者 C 报错
首先要审题,JAVA下面,int与Integer是有本质区别的,int是基本数据类型,而Integer是extends的Object的类。g(1)调用参数1,是整形,基本类型。调用时候匹配谁。先匹配基本类型。这里基本类型只有double。所以这里应该调用参数为double的那个。即便是在C/C++下面,也依然是匹配基本数据类型。
所以本题答案是B,调参数double的函数
5、JAVA语言下,请问下面调用,选哪个?
String a = null;
switch (a)
{
}
A: 走null分支, B:"null"分支
C: 走0分支 D: 直接抛出异常
JAVA中表面上支持字符串型的switch,但是本质却是用的String.hashCode()转换成了整型值。换句话说:所谓的字符串型switch本质依然是整型值的switch。
然而本题换个写法就是:null.hashCode(),这明显就会出现空指针异常。
所以本题,明显就应该选择D,直接抛出NullPointerException。
6、请问下面哈希表,resize了几次?
import java.util.HashMap;
HashMap<Integer, Integer> a=new HashMap<Integer, Integer>(10000);
for (Integer i = 0; i < 10000; i++) a.put(i, i);
A: 1次 B:2次: C: 0次
HashMap以数组+链表+红黑树组合而成,一般会在数量达到原来数量之后才会去扩容,总是以上一次大小的2倍扩容机制——也就是2次幂扩容机制。前提是:超过之后才会resize。本题刚刚装满,并未超出。
所以本题答案是C:0次。如果再多一次put,那么则会resize一次。