騰迅校園招聘筆試題:不使用中間變量實(shí)現(xiàn)strlen函數(shù)
[導(dǎo)讀]2009騰迅校園招聘筆試題:不使用中間變量求const字符串長度,即實(shí)現(xiàn)求字符串長度庫函數(shù)strlen函數(shù)。函數(shù)接口聲明如下:int strlen(const char *p);思路分析:?????“
2009騰迅校園招聘筆試題:不使用中間變量求const字符串長度,即實(shí)現(xiàn)求字符串長度庫函數(shù)strlen函數(shù)。函數(shù)接口聲明如下:int strlen(const char *p);
思路分析:
?????“不使用中間變量”是說程序員不能顯式的申請內(nèi)存,即不能有局部變量或者動態(tài)內(nèi)存申請。如果函數(shù)自動申請棧內(nèi)存或者使用寄存器存儲變量,或者使用立即數(shù)尋址即常量,那么就相當(dāng)于“不使用中間變量”。從函數(shù)原型看,返回值為int,那么在函數(shù)內(nèi)部必定需要一個地方存儲這個值,要么是常數(shù)要么是寄存器。長度不為1時不能一次就求出來,說明必須有遞歸調(diào)用,這樣遞歸時函數(shù)會自動申請棧內(nèi)存,這樣就相當(dāng)于程序員“不使用中間變量”了。中間返回的值通過寄存器自動保存,最后一次返回時拷貝到int中去。C++中也有臨時對象的概念,都是程序在運(yùn)行過程中由編譯器在棧中自動申請的對象,對程序員不可見,也相當(dāng)于“不使用中間變量”
另外一個不申請任何變量的典型題目是:反轉(zhuǎn)字符串
?????? 這種問題都是利用常量,或者將變量的申請交給編譯器在遞歸過程中自動在棧中申請。
#includeusing?namespace?std; int?mystrlen(const?char*?str) { if(str==NULL) return?0; if(*str!='