一道編程題讓老程序員鄒起了眉頭,這樣的題你會(huì)怎么解?

對(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)注我吧!? ? ? ? ? ? ? ? ? ? ? ? ? ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、你已經(jīng)意識(shí)到中年危機(jī)了嗎?有什么征兆?你是如何看待他們的? 一般的來說,愛情婚姻會(huì)經(jīng)歷四個(gè)時(shí)期:(1) 浪漫期...
    喜歡空谷幽蘭閱讀 425評(píng)論 0 0
  • 【昨夜的夢(mèng)】 窄窄的路上,我和朋友一起健步如飛,我跑在第一個(gè),途遇一條長(zhǎng)長(zhǎng)的蛇,吐著紅紅舌頭正朝我爬來,我一個(gè)急剎...
    張子羽閱讀 683評(píng)論 5 11

友情鏈接更多精彩內(nèi)容