程序员面试宝典学习笔记02

5.1 面试题2

程序的运行结果是:10、10、1、3、1、7、1。

分析:1.首先程序开始进入main函数,定义局部变量xyz并对局部变量x进行初始化,初始化值为2。我们在定义变量时可以选择初始化,也可以不初始化。如果不初始化,编译时只会分配对应类型所占空间,没有值。

            2.第九行,根据运算符的优先级表(C++ Primer第五版 第147页,自己看),首先执行z=5,然后y=z,然后x=x*y,最终x=10,所以cout输出流输出10

           3.第12行,首先y = z,然后x==y结果为布尔型0,因为10≠3,但x=10没有被改变,所以输出仍然是10,警告里也很好地说明了这一点,这个==不起作用。

           4.第13行,y==z结果为真即1,因为第十二行的赋值语句y此时与z相等都是3.然后x被赋值为1,所以输出1

           5.第14行,y与z进行与运算,结果为3,所以输出结果为3

           6.第15行,y且z,因为y、z都不是零,所以都是真,真&&真=真,即1,所以输出1

           同理线面的18、19行输出结果为7和1。

 

5.1 面试题3

为什么结果是8呢?

分析,首先拿到这种题根本不用慌,这就是个送分题,所谓的 func(9999)就是吓唬人的,笔试时不可能让你打开vs后把程序写下来运行,所以这其中一定是有规律的。对于这种题找规律才是正确的思路。

首先,程序还是从main函数开始(永远都是这样),main函数要求我们输出func(9999)的值。然后编译器就要去调用func()函数。

再来看func()函数,首先他被声明为 int 型,他的形参为int整型,函数内部首先定义了一个局部变量count用来计数,并对其初始化为0,接下来是个while循环体,循环结束的判断标志是x,也就是说x=0时结束循环。循环每执行一次count加一,然后对x与x-1进行与操作(同一则为一,都是真才是真),循环结束后func()函数返回count值。

然后就是找规律,显然找规律的重点就是第12行,我们要找到与运算后对x造成了什么影响。

因为同一才为一,(x-1)的2进制必然会使得他与x的2进制相比有一位从1变为了0,或从1变为了0以及从零变为1,二者都发生(举个例,6=110,5=101,4=100,从6到5是后者,5到4是前者)当然不论哪种情况发生与运算后都会使得x2进制本身少了一个1。而9999的二进制为10011100001111,有9个1,所以最终count = 9。

这题出题人已经很仁慈了,一个9999就是在变相提醒我们这是有规律的。如果是func(16)真的就会有人一点一点的算下去了,虽然也只是算了4次,但时间就浪费了。要知道面试题一般都是时间很紧迫的,这么一点时间的浪费,基本题就做不完了。

                                                                                                                                                                                                           以上!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章