程序員面試寶典學習筆記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次,但時間就浪費了。要知道面試題一般都是時間很緊迫的,這麼一點時間的浪費,基本題就做不完了。

                                                                                                                                                                                                           以上!

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