`

收集各种诡异的笔试面试题(不断更新)

阅读更多

 

要想找到一份好工作,笔试面试这关必须得通过。且先不说您的能力怎么样,有时觉得笔试面试就如同英语考试。一个“英语很好”的人,比如可以很流利的说英语,跟老外交流,然而,让他参加考研之类的英语考试,未必能够得到很高的分数,因为这类题本身就很诡异,考试需要有一定的技巧才行。当然,考试还是能够反映一个人的水平的。类似的,如果您很牛,但要找到一份好工作,好好复习一下笔试面试的知识还是很必要的,因为难免出现一些“诡异”的题目,这些题目中的做法可能实际应用中,你永远也见不到。今天polaris收集一些“诡异”的笔试面试题分享给大家,这些题目本身没有多大意义,主要是明白为什么结果是这样,明白其原理。这些题目大部分是Java语言的,如果涉及到其他语言会特别说明。

1、int j = 0;j = j++; 问j现在等于多少?

没见过此题的人,大部分人可能得到的结果是:1。 然而,运行的结果会令您彻底失望。这是什么原因呢?原来Java编译器处理后缀++或--时是这么处理的:java的编译器在遇到j++和j- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉。即JAVA先将j的值保存到临时内存空间中,然后处理++,即原来的j加1,此时原来的j变成1,然后再执行赋值,将内存空间中所存放的原来的值赋回给j,所以j仍然是0。C#和Java的结果是一样的。

相反,C/C++不是这么处理的:C中是通过寄存器作中转先把j的值赋给它本身,再执行++的操作,这样结果就是1了。

2、一道邪恶的Java基础题——来自JavaEye的网友

题目是:

 

String a = "abc"; 
String b = "abc"; 
System.out.println("====>"+ a==b ); 

 

请问输出结果是true还是false?

这道题只要稍微仔细点就能够做出来。当然,我想大部分人可能都会掉入出题者的圈套中。

这道题目其实就是考察您是否细心以及运算符优先级。“+”的优先级高于“==”,因而打印语句先执行“+”操作,这样实际上比较的是"====>abc"与"abc",很明显会返回false。不过此题有一种人可能会做对,即认为a==b返回的是false。

其实此题可以改得更难点,即改为System.out.println(""+ a==b ); 当然结果还是一样的,只是多考察了一个知识点:"" + a 与 b是否指向同一个对象。String永远是面试官最喜欢考的知识点。为了加深对String的理解,polaris出了另外几个“诡异”的关于String的题目,看您能做对几个?点击查看《通过六个题目彻底掌握String笔试面试题》

3、try中包含return语句,finally是否还执行,在return之前还是之后?

这道题也许没有那么邪恶,而且这道题是各种Java笔试大全中都可以看到的一道题。然而,由这道题,您有没有更深入地考虑更多的问题。在此polaris进行一下引申,看如下代码:

 

public static boolean get() {
	try {
	       return  false;
	} finally {
	       return  true;
	}
}

 

请大家思考一个问题,return的具体实现是怎样的?如果返回false,为什么;如果返回是true,又是为什么呢?给个你认为正确答案的理由出来。

我们都知道,try中包含return语句,finally仍然会执行,且在return之前执行(其实,对这个答案polaris不是很赞同,就像JavaEye上有人详细分析一道题:构造了几个String对象一样。polaris觉得出这样的题目也是很没有水准的)。如果答案是在return之前执行,那为什么上面的代码返回结果却是true,如何解释?

这道题目本身没有什么意义,题目本身不是很严谨,对finally语句中是什么内容没有说明,内容不一样,答案会不一样。return语句执行做了什么?如果finally中的语句包含break;continue等又会是什么样的结果?

根据《JVM Specification 3.0》的4.9.6节,在try中的return真正返回之前,会将false保存到一个临时变量(假设为var)中,然后执行finally,在执行finally子句的任何语句之前,会将var中的值取出,如果finally中没有抛出异常或return、break、continue等语句,则在finally执行完后返回var(相当于返回去完成try中return的执行),如果finally中有return,var值会被覆盖,返回结果是finllay子句中return的值,如果是异常或break、continue等则执行相应的操作而不是返回。更详细解释参考JVM规范或《深入理解JAVA虚拟机(第二版)》。

 

到polaris的博客查看更多

更新记录

完成于2010/10/3 16:10,由于polaris水平有限,如有疏忽,敬请指正。


分享到:
评论
23 楼 373045912 2010-10-10  
这些题目确实意义不大。。。
22 楼 polaris1119 2010-10-09  
tianfing 写道
楼主的贴子里称呼自己从来不用“我”,总是用名称来自称,很有意思!

哈哈哈。被你发现了。呵呵。因为很喜欢"polaris"这个词哦。
21 楼 tianfing 2010-10-09  
楼主的贴子里称呼自己从来不用“我”,总是用名称来自称,很有意思!
20 楼 polaris1119 2010-10-09  
恋曲2000 写道
即JAVA先将i的值保存到临时内存空间中,然后处理++,即原来的j加1
----------------------------------
应该是先将j的值保存到临时内存空间中吧。


笔误,已更正。谢谢。
19 楼 恋曲2000 2010-10-09  
即JAVA先将i的值保存到临时内存空间中,然后处理++,即原来的j加1
----------------------------------
应该是先将j的值保存到临时内存空间中吧。
18 楼 Crusader 2010-10-08  
polaris1119 写道
Crusader 写道
#include <iostream>

int main(void){
	int j = 0;
	j = j++;
	std::cout<<j<<std::endl;
	return 0;
}


------------------------------------
0

Terminated with return code 0
Press any key to continue ...


请问用的啥编译器?我用Visual Studio 2008测试结果不是这样的。是1


MinGW,个人认为前后缀++实现如下:
++x  →  (x+=1)
x++  →  (temp=x, x+=1, temp) 注意逗号表达式

17 楼 icefishc 2010-10-08  
cch123 写道
1
GCC 4.4.1
这种题确实没啥意义,
真面这样的题,你就问他要是我写出类似于i=(++i)+(i++)的代码,
领导还不把我给开了

虽然这么写是错的, 但题还是有意义的。这些都属于基础知识。 如果答不出来那怎么知道为什么不这么写。
16 楼 cch123 2010-10-08  
1
GCC 4.4.1
这种题确实没啥意义,
真面这样的题,你就问他要是我写出类似于i=(++i)+(i++)的代码,
领导还不把我给开了
15 楼 polaris1119 2010-10-08  
icefishc 写道
polaris1119 写道
icefishc 写道

c++的事还真不能靠试。。。 在c++这个应该是undefined behavior

undefined behavior?从何体现?编译不通过?

undefined behavior的意思就是
它的结果不确定,也许取决于你用的编译器也许取决于你的优化参数或其他外部条件。
你所看到的结果只是一种可能。

你说的有道理,这个结果的确跟编译器有关,而C++编译器又有不同的实现,因而可能结果真的不一样。我用VS测试结果是1。
14 楼 polaris1119 2010-10-08  
Crusader 写道
#include <iostream>

int main(void){
	int j = 0;
	j = j++;
	std::cout<<j<<std::endl;
	return 0;
}


------------------------------------
0

Terminated with return code 0
Press any key to continue ...


请问用的啥编译器?我用Visual Studio 2008测试结果不是这样的。是1
13 楼 polaris1119 2010-10-08  
yangguo 写道
看回复就发现很多人不应该做程序员,应该去做粪青。屁都不懂就知道武断。

ps:这类题玩得太多也没有意思,你还可以找些更诡异的拿来问面试官。

的确,这种题也就是一些无聊的面试官会出,他们碰巧知道这个,然后就想刁难你。其实没啥意思。不过为了应付面试又得了解点。
12 楼 icefishc 2010-10-08  
polaris1119 写道
icefishc 写道

c++的事还真不能靠试。。。 在c++这个应该是undefined behavior

undefined behavior?从何体现?编译不通过?

undefined behavior的意思就是
它的结果不确定,也许取决于你用的编译器也许取决于你的优化参数或其他外部条件。
你所看到的结果只是一种可能。
11 楼 Crusader 2010-10-08  
#include <iostream>

int main(void){
	int j = 0;
	j = j++;
	std::cout<<j<<std::endl;
	return 0;
}


------------------------------------
0

Terminated with return code 0
Press any key to continue ...

10 楼 yangguo 2010-10-08  
看回复就发现很多人不应该做程序员,应该去做粪青。屁都不懂就知道武断。

ps:这类题玩得太多也没有意思,你还可以找些更诡异的拿来问面试官。
9 楼 polaris1119 2010-10-08  
icefishc 写道

c++的事还真不能靠试。。。 在c++这个应该是undefined behavior

undefined behavior?从何体现?编译不通过?
8 楼 icefishc 2010-10-08  
polaris1119 写道
swanky_yao 写道
polaris1119 写道
yuliu312832473 写道
这第一题解释的也太复杂了吧???
java和c都一样  有i++和++i两种运算
i++是:先用了i在进行运算,自然i=i++是0
++i是先运算了再用i,这也就是i=++i是1嘛 
    语言就是这么设计的   ,你说的什么真的是太复杂了 而且不容易看懂

你太牛了!!我说面都说了,两种语言运行结果不一样的。你运行试试,看C/C++中i=i++是不是0。

俺没试 不过 俺真的不信C和Java会不一样

据俺回忆 入门第一式就是 i++、 ++i 同意yuliu312832473的说法

看到帖子的第一题就有点失望 这个...不诡异...纯基础

说真的 这几道题(目前是三道)都是语言基础题(澄清一下,俺不是说它简单,因为基础题也很考人),归类的话还算不上诡异


兄弟,你还是试试吧。我说它诡异,自然是有点道理的。事实是检验真理的唯一标准。而不是你说的觉得不信。你试试就知道了。


c++的事还真不能靠试。。。 在c++这个应该是undefined behavior
7 楼 lzxz1234 2010-10-08  
前两个没疑问,就是第三个挺搞,有趣
6 楼 polaris1119 2010-10-07  
swanky_yao 写道
polaris1119 写道
yuliu312832473 写道
这第一题解释的也太复杂了吧???
java和c都一样  有i++和++i两种运算
i++是:先用了i在进行运算,自然i=i++是0
++i是先运算了再用i,这也就是i=++i是1嘛 
    语言就是这么设计的   ,你说的什么真的是太复杂了 而且不容易看懂

你太牛了!!我说面都说了,两种语言运行结果不一样的。你运行试试,看C/C++中i=i++是不是0。

俺没试 不过 俺真的不信C和Java会不一样

据俺回忆 入门第一式就是 i++、 ++i 同意yuliu312832473的说法

看到帖子的第一题就有点失望 这个...不诡异...纯基础

说真的 这几道题(目前是三道)都是语言基础题(澄清一下,俺不是说它简单,因为基础题也很考人),归类的话还算不上诡异


兄弟,你还是试试吧。我说它诡异,自然是有点道理的。事实是检验真理的唯一标准。而不是你说的觉得不信。你试试就知道了。
5 楼 swanky_yao 2010-10-07  
polaris1119 写道
yuliu312832473 写道
这第一题解释的也太复杂了吧???
java和c都一样  有i++和++i两种运算
i++是:先用了i在进行运算,自然i=i++是0
++i是先运算了再用i,这也就是i=++i是1嘛 
    语言就是这么设计的   ,你说的什么真的是太复杂了 而且不容易看懂

你太牛了!!我说面都说了,两种语言运行结果不一样的。你运行试试,看C/C++中i=i++是不是0。

俺没试 不过 俺真的不信C和Java会不一样

据俺回忆 入门第一式就是 i++、 ++i 同意yuliu312832473的说法

看到帖子的第一题就有点失望 这个...不诡异...纯基础

说真的 这几道题(目前是三道)都是语言基础题(澄清一下,俺不是说它简单,因为基础题也很考人),归类的话还算不上诡异
4 楼 polaris1119 2010-10-07  
yuliu312832473 写道
这第一题解释的也太复杂了吧???
java和c都一样  有i++和++i两种运算
i++是:先用了i在进行运算,自然i=i++是0
++i是先运算了再用i,这也就是i=++i是1嘛 
    语言就是这么设计的   ,你说的什么真的是太复杂了 而且不容易看懂

你太牛了!!我说面都说了,两种语言运行结果不一样的。你运行试试,看C/C++中i=i++是不是0。

相关推荐

Global site tag (gtag.js) - Google Analytics