C语言编程笔记:关于 for循环 的那些不为人知的秘密
點(diǎn)擊上方藍(lán)字關(guān)注我,了解更多咨詢
好吧,也許你認(rèn)為我在寫(xiě)一篇如何使用for循環(huán)的文章,,,,首先,我想說(shuō)無(wú)論是學(xué)習(xí)C語(yǔ)言還是學(xué)習(xí)java的同學(xué)都能從此文中獲益,還有,你確定你會(huì)用for循環(huán)嗎?其實(shí)許多東西你只是在表面,要品才能有一種感覺(jué),有的時(shí)候,我喜歡咬文嚼字一下,所以你可以認(rèn)為我現(xiàn)在在程序中討論關(guān)于“用推還是用敲”的話題。
先來(lái)問(wèn)你一個(gè)問(wèn)題,一個(gè)簡(jiǎn)單的數(shù)學(xué)問(wèn)題,不過(guò)你盡量快點(diǎn)回答,區(qū)間[9,15]中有幾個(gè)整數(shù)?
多數(shù)想馬上表現(xiàn)自己聰明的同學(xué)可能會(huì)馬上回答6個(gè),但是是7個(gè),你會(huì)發(fā)現(xiàn)這種雙閉區(qū)間的元素會(huì)比你想象得多,就連[9,9]都有一個(gè)元素是嗎?而半開(kāi)半閉就不同了[0,10)你可以不假思索地用[m,n)中有n-m個(gè)元素,來(lái)回答這個(gè)答案,10個(gè)元素,你發(fā)現(xiàn)什么了沒(méi)?這。。有點(diǎn)像數(shù)組,恩恩,這個(gè)問(wèn)題就是我們?cè)诒疚暮竺鎸⒂懻摰哪闳绾尾拍苁炀毜厥褂眠@些多1少1的問(wèn)題。現(xiàn)在先開(kāi)始說(shuō)for循環(huán)
我常常把最簡(jiǎn)單的for循環(huán)稱之為循環(huán)計(jì)數(shù)器:
for(inti =1;i<=10;i++)cout<<"求妹子"<你看,這里的i只是一個(gè)計(jì)數(shù)的作用,它在告訴cpu,去把我的這條語(yǔ)句執(zhí)行十次吧!
你可能會(huì)說(shuō),這有什么?for都是這樣的呀!請(qǐng)你往下看
for(inti =1;i<=10;i++)cout<<"求"<這個(gè)for就不同了,它把i做為一種產(chǎn)物,在循環(huán)中使用它,我把它稱之為循環(huán)產(chǎn)生器,這個(gè)i就不僅僅是讓循環(huán)執(zhí)行十次的作用了,它在每次的循環(huán)中產(chǎn)生,循環(huán)體的語(yǔ)句中有自己的作用,所以當(dāng)你理解所謂的循環(huán)產(chǎn)生器,你就會(huì)很輕松地寫(xiě)出各種多層循環(huán)的程序了,比如崔哥曾出個(gè)這樣一個(gè)題:
請(qǐng)用循環(huán)語(yǔ)句打印一個(gè)空心菱形:
我將用一種清晰的思路來(lái)分析寫(xiě)這個(gè)程序,
嗯,我先寫(xiě)一個(gè)函數(shù),它提供的接口如下:
void print(int n,int p,int q);//在一行輸出n個(gè)元素,除了在p和q輸出*其它地方都輸出空格恩,很簡(jiǎn)單的一個(gè)函數(shù):
void print(int n,int p,int q) {for(int i = 1;i<=n;i++){if(i==p||i==q)printf("*");elseprintf(" ");}printf("\n"); }void print(int n,int p,int q) {for(int i = 1;i<=n;i++){if(i==p||i==q)printf("*");elseprintf(" ");}printf("\n"); }所以,用所謂的循環(huán)產(chǎn)生器,產(chǎn)生我們需要的參數(shù)傳遞給這個(gè)函數(shù)不就行了嗎?
下面,我們先做一些約定
“你我約定,難過(guò)的往事不許提”。。。
開(kāi)玩笑了,,,我們繼續(xù):
首先,輸出空心菱形,這個(gè)行數(shù)一定是個(gè)奇數(shù),
所以我們用1到LOW來(lái)表示這LOW個(gè)位置,而且中間的那個(gè)位置就是LOW/2+1
這樣我們的程序就是這樣:
#define LOW 13 int j,k,n = LOW/2+1;//空心菱形的中間位置 j=k=n; for(int i = 1;i<=LOW;i++) {print(LOW,j,k);if(i<n)j--,k++;elsej++,k--; }i做為一個(gè)產(chǎn)生器,不但讓循環(huán)執(zhí)行LOW次(打印low行)同時(shí)也控制產(chǎn)生這j和k這兩個(gè)參數(shù)了,當(dāng)然我們?cè)谇逦览碇?#xff0c;完全可以把這個(gè)函數(shù)嵌到循環(huán)中,看只用了兩個(gè)for,而不是某些同學(xué)的分段循環(huán),四個(gè)for。。。
繼續(xù)討論有關(guān)for的話題,現(xiàn)在我要通過(guò)說(shuō)明for的一些使用細(xì)節(jié),來(lái)向你展示,你用什么樣的語(yǔ)言決定你的編程思維,我問(wèn)你如果讓你訪問(wèn)數(shù)組a[10]的每個(gè)元素,你會(huì)寫(xiě)怎樣的代碼?
for(int i = 0;i<=9;i++)還是
for(int i = 0;i!=10;i++)我一直都是使用第二種,因?yàn)檫@可以很好地說(shuō)明半開(kāi)半閉區(qū)間的思想,而且,C數(shù)組本身就是從零開(kāi)始的,我們用10來(lái)表示它最后一個(gè)元素的下一個(gè)位置(因?yàn)樽詈笠粋€(gè)元素是a[9]),
其實(shí),不僅僅是數(shù)組,在許多語(yǔ)言的迭代器(包括c++標(biāo)準(zhǔn)庫(kù))中都會(huì)使用第一個(gè)元素表示頭,最后一個(gè)元素的下一個(gè)位置表示尾,半開(kāi)半閉區(qū)間的這種思想可以讓你不用陷入多1或是少1的問(wèn)題中,比如[n,n)是沒(méi)有元素的,[n,m)是有m-n個(gè)元素的。。
至于為什么是i!=10,而不是i<10,那要是這樣的語(yǔ)句呢?
for(int i = 10;i!=0;i--)不用把”<”改成”>”了,而且。。。作為一個(gè)終止?fàn)顟B(tài),還有用(后面論述)
現(xiàn)在還記得開(kāi)頭的那個(gè)求妹子的例子嗎?
for(inti =1;i<=10;i++)cout<<"求"<這里我就讓i從1到10,(我不可能求0個(gè)妹子吧?)所以,這種對(duì)循環(huán)i的選取,0或1,是很有細(xì)節(jié)思考的。
下面再看一個(gè)例子:
inti;for(i=0;a[i]!='c'&&i!=N;i++);這段代碼的作用是在一個(gè)char數(shù)組中找到第一個(gè)是’c’的元素,并返回它的索引
有幾個(gè)有趣的地方:
我把i的定義放在外面
這個(gè)for循環(huán)沒(méi)有循環(huán)體,看那個(gè)分號(hào)。。。。。。
不是計(jì)數(shù)器,不是產(chǎn)生器,我喜歡把這種for稱之為循環(huán)搜捕器,它用來(lái)找一個(gè)元素
所以我把i定義在循環(huán)外,因?yàn)橹笪覀冞€要使用到i,而同時(shí)也與前面的那些for循環(huán)中把i定義到for里面形成了對(duì)比,因?yàn)橹暗淖饔?#xff0c;我并不想把它的作用域外流,實(shí)際上,在c++中鼓勵(lì)你這么使用for,不讓它外流,這種東西在vc6.0會(huì)出點(diǎn)問(wèn)題(因?yàn)樗皇菢?biāo)準(zhǔn)的c++),因?yàn)閕的作用域會(huì)外流,所以你就不能寫(xiě)for(int i;;)這樣的語(yǔ)句兩次,它會(huì)報(bào)錯(cuò)說(shuō)你重定義了。而在c語(yǔ)言中,之前是不支持for(int i;;)這種定義方式的,不過(guò)在c99的時(shí)候,它也支持了,并鼓勵(lì)你這樣寫(xiě)。
并且,通過(guò)這個(gè)搜捕器,它的條件是a[i]!='c'&&i!=N,所以循環(huán)終止時(shí),是a[i]=='c'||i==N這就是我之前說(shuō)的終止條件,我們就可以在之后寫(xiě)這樣的語(yǔ)句;
if(i==N)//沒(méi)找到else//找到了。i 是它的下標(biāo)這就是為什么用’!=’而不是<的原因了,這可以很清楚地看清終止條件。
以上就是今天的分享,小伙伴們可以點(diǎn)個(gè)贊支持一下喲~
END
*聲明:本文于網(wǎng)絡(luò)整理,版權(quán)歸原作者所有,如來(lái)源信息有誤或侵犯權(quán)益,請(qǐng)聯(lián)系我們刪除或授權(quán)事宜。
戳“閱讀原文”我們一起進(jìn)步
總結(jié)
以上是生活随笔為你收集整理的C语言编程笔记:关于 for循环 的那些不为人知的秘密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进口化妆品备案(进口护肤品备案)
- 下一篇: 王者荣耀安卓微信区转苹果微信区(王者荣耀