對(duì)程序員來說,程序的魅力在于它的變化無窮,對(duì)于一門計(jì)算機(jī)語言來說,他的基礎(chǔ)語法是固定有限的,可是編程的花樣卻是千變?nèi)f化,無法窮舉,可以用它做出無數(shù)個(gè)不同領(lǐng)域,不同業(yè)務(wù),形形色色的產(chǎn)品,正因?yàn)檫@么靈活,關(guān)于編程的題目,也是自然很多,想必面試過的程序員都見過各種各樣的面試題,有簡(jiǎn)單的,有“造火箭”的,有非常挑戰(zhàn)大腦思考力的等等,近期,一名程序員網(wǎng)友就被一道編程題難住了,他把這樣的題目分享給了大家。
根據(jù)這名程序員的分享,可以看出應(yīng)該是c++編程題,不過重在考察程序員的思路,是考察程序員的思考能力,題目?jī)?nèi)容如下圖,具體的操作要求是在pass函數(shù)中進(jìn)行一番操作,然后使得第二個(gè)打印語句輸出
456,這個(gè)題目看上去很一般,不過與往常我們的情況不一樣的地方是pass函數(shù)并不可以傳參,傳引用什么的,第二個(gè)方法如何改變x值呢?針對(duì)這樣的情況,讓我們看看有沒有程序員網(wǎng)友可以給出讓人眼睛一亮的方案吧!
網(wǎng)友一:pass函數(shù)里面print 456,然后exit。 保證屏幕第二個(gè)打印的是456
上世是朵花:這么做輸出的結(jié)果與想要的結(jié)果是一樣的,不過請(qǐng)注意審題,題目中的要求是:“使得第二個(gè)打印語句輸出 456”,你這算是阻止了第二個(gè)語句的打印,重新偽造了一個(gè)打印語句。
網(wǎng)友二:64位系統(tǒng)gcc 測(cè)試通過。不同編譯器和系統(tǒng)會(huì)有所不同。int tmp; *(&tmp+8) = 456;
上世是朵花:雖然沒驗(yàn)證這段代碼,但是已經(jīng)看出這名網(wǎng)友的思路是通過內(nèi)存尋址的方式改變x的值,這是一個(gè)思路。
網(wǎng)友三:在C中調(diào)函數(shù)會(huì)創(chuàng)建一個(gè)棧幀,棧幀范圍是2指針(rbp,rsp)確定,棧擴(kuò)張是從地址高到低,在pass中定義變量x1,地址減去一定值訪問main中的x。這個(gè)值跟編譯時(shí)優(yōu)化程度有關(guān)。g++ -O2優(yōu)化,會(huì)省掉創(chuàng)建棧幀的指令和內(nèi)存分配,x的地址即x1減int寬度??梢栽趐ass中加兩行:int x1;*reinterpret_cast(reinterpret_cast(&x1)-sizeof(int)) = 456;使用g++ -O2 -std=cpp11編譯
上世是朵花:這名網(wǎng)友說出了實(shí)現(xiàn)的思路,核心思想與網(wǎng)友二差不多,但是考慮到的更細(xì)致一點(diǎn)。
網(wǎng)友四:從上面的回答可以看出你們這些程序員c語言基礎(chǔ)之差。
上世是朵花:評(píng)論題目就行,評(píng)論人就不友好了。
網(wǎng)易員工:第二個(gè)打印語句不一定是主函數(shù)里面的第二個(gè)printf吧
上世是朵花:這不就是“網(wǎng)友一”的思路么?
網(wǎng)友六:這是腦筋急轉(zhuǎn)彎吧。
上世是朵花:這名網(wǎng)友是這么認(rèn)為的,看你怎么看了。
騰訊員工:如果是單解這道題,就從pass里的臨時(shí)變量地址往上遍歷,發(fā)現(xiàn)了123的值,就姑且認(rèn)為就是那個(gè)x了,然后改成456。不過這類題很古董了,現(xiàn)在寫業(yè)務(wù)代碼的同學(xué)大把都不知道。
上世是朵花:有道理,除了遍歷尋址的方式好像還真想不到其他更好的辦法。
網(wǎng)友八:用堆棧溢出來做的我一律不通過。這叫ub,ub的東西你也能告訴我這是正確的?
上世是朵花:這名網(wǎng)友diss了一部分網(wǎng)友,不過更期待的是你能給出高明的辦法。
從上面網(wǎng)友的評(píng)論中可以看出兩種思路,一種是通過“障眼法”的方式達(dá)到與預(yù)期結(jié)果一致,這個(gè)思路也是很值得贊的,不過仔細(xì)審題的話,有點(diǎn)不符合題目中的要求,第二種思路是通過內(nèi)存尋址的方式找到x的指針位置,然后給其賦值456,這種做法是符合了題目中的要求,不過在我們實(shí)際做項(xiàng)目中,這樣的方法我們都不會(huì)去用的,因?yàn)樵趯?shí)際項(xiàng)目中,變量之多,使用指針是很危險(xiǎn)的一個(gè)行為了,最后很可能會(huì)出現(xiàn)一些很奇怪的問題,還不好找原因,這也是為什么好多高級(jí)計(jì)算機(jī)語言中廢除了c++中指針這個(gè)特性的原因,頂多是會(huì)用一用引用,指針就完全廢棄了,當(dāng)然,這只是一道面試題,只要符合要求就行,也不需要考慮的太多,那么接下來,我拋出一個(gè)問題,面試官出這樣的問題又是想考察程序員的什么呢?請(qǐng)說出你的看法來,下方評(píng)論區(qū)歡迎你!
以上所有圖片均來之互聯(lián)網(wǎng)? ?
大家好,我是“上世是朵花”。如果你有什么好的看法或者觀點(diǎn)可以在評(píng)論區(qū)展現(xiàn)你的才華,互動(dòng)交流,如果想進(jìn)一步了解我,那就關(guān)注我吧!? ? ? ? ? ? ? ? ? ? ? ? ? ?