做好閉環(huán)二函數(shù)是壓縮數(shù)組展開(kāi)_第1頁(yè)
做好閉環(huán)二函數(shù)是壓縮數(shù)組展開(kāi)_第2頁(yè)
做好閉環(huán)二函數(shù)是壓縮數(shù)組展開(kāi)_第3頁(yè)
做好閉環(huán)二函數(shù)是壓縮數(shù)組展開(kāi)_第4頁(yè)
做好閉環(huán)二函數(shù)是壓縮數(shù)組展開(kāi)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

scanf在這一節(jié)里面呢《函數(shù):自己動(dòng)手實(shí)現(xiàn)低配版scanf函數(shù)》,我們講了函數(shù)的基本關(guān)于這個(gè)問(wèn)題呢,我們首先來(lái)具象化一下,我們?cè)O(shè)想一種具體的問(wèn)題情況,比如說(shuō):arr數(shù)組里面,arr[i]的是2*i的值,你可以認(rèn)為是第i個(gè)偶數(shù)的值;func函數(shù)的功能呢,func(x)=2*x,就是計(jì)算得到第x個(gè)偶數(shù)的值。如下述示意代碼所示:代代1intarr[100]={0,2,4,6,8,10,intfunc(intx)return2*4arr和函數(shù)func很明顯,兩者的本質(zhì)不一樣,arr是數(shù)組,對(duì)于代碼arr[36],相當(dāng)于數(shù)組下標(biāo)36位置中的值;而func是函數(shù),對(duì)于代碼func(36)來(lái)說(shuō),也會(huì)得到一個(gè)整型值,但這個(gè)整型值,卻是由func的函數(shù)邏輯代碼計(jì)算得到的。簡(jiǎn)單來(lái)說(shuō),就是對(duì)于arr中的值進(jìn)行,是一個(gè)靜態(tài)的過(guò)程,而對(duì)于func函數(shù)得到返回值的過(guò)程來(lái)說(shuō),是一個(gè)動(dòng)態(tài)計(jì)算的而空間效率的話,函數(shù)通常要比數(shù)組節(jié)省很多空間,就像fuc計(jì)算得到的,通常情況下,不管我們代碼中執(zhí)行fu)func(0,我們不需要修改函數(shù)的代碼。但對(duì)于arr數(shù)組來(lái)說(shuō),當(dāng)我們需要arr[100]的時(shí)候,數(shù)組最起有1個(gè)元素空間,而當(dāng)我們想要arr[0]的時(shí)候,數(shù)組最起碼要有01站在使用者的角度來(lái)看,當(dāng)你盯著arr[100]和func(100)這兩段代碼看的時(shí)候,你沒(méi)覺(jué)得這兩個(gè)代碼的異常的相似?funcarrfunc括號(hào)換成中括號(hào),你是不是就會(huì)覺(jué)得func是一個(gè)數(shù)組?對(duì)!你可能發(fā)現(xiàn)了,在使用者看來(lái),func(100)和arr[100]的作用是完全一樣的,區(qū)別可簡(jiǎn)單來(lái)說(shuō),就是在數(shù)學(xué)里,函數(shù)做的事情就是“映射”,傳入一個(gè)值,傳出一個(gè)值。在程序中也不例外,函數(shù)做的事情,就是從傳入值到傳出值的映射。而數(shù)組做的事情呢,其實(shí)是從下標(biāo)到值的映射。你會(huì)發(fā)現(xiàn),數(shù)組和函數(shù)做的事情,本質(zhì)上都是映射!最后,我來(lái)總結(jié)一下,這個(gè)總結(jié)講對(duì)你日后的程序設(shè)計(jì)思維有巨大的幫助,這句話就是“數(shù)是壓縮的數(shù)組,數(shù)組是展開(kāi)的函數(shù)二者在程序設(shè)計(jì)方面的差別,就在于時(shí)間和空間的使用效率,數(shù)組在時(shí)間效率方面占優(yōu)勢(shì),函數(shù)在空間效率方面占優(yōu)勢(shì)。當(dāng)你理解了這些事情以后,你就可以更好的理解某些資料里面經(jīng)常講的“時(shí)間換空間”或者“空間換時(shí)間思維和函數(shù)思維之間的互相轉(zhuǎn)換。關(guān)于預(yù)處理命令這個(gè)知識(shí)點(diǎn),我們用了兩節(jié)課的篇幅來(lái)講解,《預(yù)處理命令(上):必須掌握的“黑魔法”,讓編譯器幫你寫(xiě)代碼》和《預(yù)處理命令(下):@在/c的編程環(huán)境下呢,操作比較簡(jiǎn)單,原本的程序編譯命令是gcc如果你想看到待編譯源碼的內(nèi)容,你只需要在中間加一個(gè)-E:gcctc。如果你用的是集成開(kāi)發(fā)環(huán)境,那你就需要自己搜索解決辦法了,你可以搜索XXXXXX對(duì)于課后的思考題,這里必須為用戶@Geek_Andy_Lee00和用戶@AarenShan的回答點(diǎn)贊。答案雖然不是很完美,可說(shuō),答案不重要,重要的是思考過(guò)程。下面就來(lái)看看思考題:沒(méi)有Bug的MAX就像之前所說(shuō)的,對(duì)于這個(gè)問(wèn)題呢,能否滿分通過(guò),是不重要的,重要的是你在解決這個(gè)問(wèn)題過(guò)程中遇到的一個(gè)又一個(gè)Bg,Bg一步地解決,這個(gè)問(wèn)題中,你可能遇到的幾個(gè)典型的Bg,以及解決辦法。代代1①:MAX(2,3)=2②:5+MAX(2,3)=33③:MAX(2,MAX(3,4))=4④:MAX(2,3>4?3:4)=5⑤:MAX(a++,5)=6⑥:a=我們先來(lái)實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的MAX代代1#defineMAX(a,b)a>b?a:如上所示,MAX宏的實(shí)現(xiàn),利用了三目運(yùn)算符,問(wèn)號(hào)冒號(hào)表達(dá)式,a>b條件如果成立,表達(dá)式的值等于a的值,否則等于b的值。看似沒(méi)問(wèn)題,但如果你要是運(yùn)行代碼,你會(huì)發(fā)代代1MAX(2,3)=2?5+MAX(2,3)=3?MAX(2,MAX(3,4))=4?MAX(2,3>4?3:4)=5?MAX(a++,5)=6?a=3行到底是什么錯(cuò)誤。按照宏展開(kāi)的替換原則,最外層的MAX宏會(huì)被替換成:2>MAX(3,4)?2:MAX(3,4)。然后我們?cè)賹⒗锩娴腗AX(3,4)宏展開(kāi),就變成了:代代12>3>4?3:4?2:3>4?3:代代1(2>3>4)?(3):(4?2:3>4?3:我們看到在這個(gè)里面,第一部分2>3>4是條件;第二部分3是在表達(dá)式為真時(shí)候的返代代1(4)?(2):(3>4?3:422>3>42>310,230,04判斷,結(jié)果也是0。2>3>4這個(gè)表達(dá)式的值,就是是轉(zhuǎn)到了兩個(gè)問(wèn)號(hào)冒號(hào)表達(dá)式的部分,剩下的事情,你自己就可以理解,最終原表達(dá)式的值2理解了原表達(dá)式值計(jì)算的原理以后,下面讓我們來(lái)分析一下,為什么會(huì)出現(xiàn)這種問(wèn)題。本質(zhì)原因,就在于我們實(shí)現(xiàn)的宏中,參數(shù)b它們放到問(wèn)號(hào)冒號(hào)表達(dá)式中,導(dǎo)致展開(kāi)以后的內(nèi)容前后連接到一起后,改變了原本我們想要的計(jì)算順序。代代1#defineMAX(a,b)(a)>(b)?(a):代代1MAX(2,3)=2?5+MAX(2,3)=33MAX(2,MAX(3,4))=4MAX(2,3>4?3:4)=5?MAX(a++,5)=6?a=1行、第3行、第4第二行內(nèi)容的輸出,加以分析,你一定可以知道如何修正第2行的結(jié)果錯(cuò)誤。如果你努力以后,還是想不到的話,可以參考用戶@AarenShan的留言。這樣做以后呢,你程序的代代1MAX(2,3)=25+MAX(2,3)=3MAX(2,MAX(3,4))=4MAX(2,3>4?3:4)=5?MAX(a++,5)=6?a=其中還是有兩行是錯(cuò)誤的,你如果試著展開(kāi)第5代代1a++>5?a++:在這行代碼中,如果a++表達(dá)式的值真的大于5的話,那么a++就會(huì)被執(zhí)行兩次。而原a+a++過(guò)的typeof相關(guān)的技巧了,下面是我給你準(zhǔn)備的參考代碼:代代#defineMAX(a,b)({ typeof(a)a=(a),b=(b);\ a>b?a:b;\4在這段代碼中,我們定義了兩個(gè)中間變量,a和b用來(lái)宏參數(shù)中a和b部分的原本的值,之后判斷大小的部分呢,我們使用新的變量a和b即可。這段代碼中,我們看到了,無(wú)論是a部分,還是b第655Bug至此,我們就幾乎完美地解決了X雖然強(qiáng)大,可你需要擁有掌握這種強(qiáng)大的力量。這份力量,包括了你的基礎(chǔ)知識(shí)儲(chǔ)量,還包括了你嚴(yán)謹(jǐn)?shù)乃季S邏輯。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論