摘要:表達(dá)式表達(dá)式為調(diào)整部分,用于循環(huán)條件的調(diào)整。語句的循環(huán)控制變量建議不可在循環(huán)體內(nèi)修改循環(huán)變量,防止循環(huán)失去控制。建議語句的循環(huán)控制變量的取值采用前閉后開區(qū)間寫法。注意當(dāng)條件初始化條件判斷條件更新都省略后,程序?qū)⑦M(jìn)入死循環(huán)。
目錄
3.2.2 break與continue在for循環(huán)中
我們已經(jīng)知道了while循環(huán),但是我們?yōu)槭裁催€要一個for循環(huán)呢?
首先來看看for循環(huán)的語法:
for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3) 循環(huán)語句;
表達(dá)式1
表達(dá)式1為初始化部分,用于初始化循環(huán)變量的。我們稱之為條件初始化。
表達(dá)式2
表達(dá)式2為條件判斷部分,用于判斷循環(huán)時候終止。我們稱之為條件判斷。
表達(dá)式3
表達(dá)式3為調(diào)整部分,用于循環(huán)條件的調(diào)整。我們稱之為條件更新。
循環(huán)語句
每一次進(jìn)入循環(huán)條件判斷通過后需要執(zhí)行的語句,如果想要執(zhí)行多條語句需要用{}將我們需要要執(zhí)行的多條語句括起來形成一個語句塊。
從上面可以看出:for語句與while語句與do while語句不同的地方在于它的條件初始化、條件判斷、條件更新更為緊湊,都在同一個()內(nèi),方便我們進(jìn)行后續(xù)的修改,而do while 與while語句這三個部分相隔就比較遠(yuǎn),不便于進(jìn)行修改,也因此我們使用for循環(huán)的頻率更高。
下面給大家舉個例子吧,幫助大家了解一下for循環(huán)語句的使用!
使用for循環(huán)在屏幕上打印1~10的數(shù)字。
#include
int main(){ int i = 0; //for(i=1/*初始化*/; i<=10/*判斷部分*/; i++/*調(diào)整部分*/) for (i = 1; i <= 10; i++) { printf("%d ", i); } return 0;} 3.2.2 break與continue在for循環(huán)中
通過對比while和do while,它們在使用continue和break時,唯一的區(qū)別點在于for在執(zhí)行continue后進(jìn)入的是條件更新語句,而while與do while則進(jìn)入條件判斷語句,然后進(jìn)入下一次循環(huán),而使用break時兩者都一樣,都是跳出循環(huán)。?
建議:
1. 不可在for 循環(huán)體內(nèi)修改循環(huán)變量,防止 for 循環(huán)失去控制。
2. 建議for語句的循環(huán)控制變量的取值采用“前閉后開區(qū)間”寫法。原因就是左閉右開可以清楚的看出循環(huán)次數(shù)。(當(dāng)然,這并不是強(qiáng)制的,有時也應(yīng)該根據(jù)使用場景進(jìn)行靈活變通)
下面給出一個例子,幫助大家理解第二條建議:
int i = 0;//前閉后開的寫法for(i=0; i<10; i++){}//兩邊都是閉區(qū)間for(i=0; i<=9; i++){}
觀察上面兩個例子,前者采用的是左閉右開,后者采用的是完全閉區(qū)間,而前者很容易就能看出該循環(huán)的循環(huán)次數(shù)為10次,即10減去0,而后者則需要9-0+1才能得到真正的循環(huán)次數(shù),雖然左閉右開不是強(qiáng)制規(guī)定的,但卻是眾多程序員所極力推薦的,因為這樣寫的話將會有更好的閱讀體驗,也有助于后續(xù)的調(diào)試。
(1)死循環(huán)
#include
int main(){ //代碼1 for (;;) { printf("hehe/n"); } //for循環(huán)中的初始化部分,判斷部分,調(diào)整部分是可以省略的,但是不建議初學(xué)時省略,容易導(dǎo)致問題。 條件初始化,條件判斷,條件更新都是可以根據(jù)具體需要進(jìn)行省略的,但我們往往并不推薦進(jìn)行省略,因為加上之后程序?qū)⒂懈恿己玫拈喿x體驗,而且完全省略后將其寫在其它地方的話,相當(dāng)于我們也放棄了for循環(huán)的真正作用,即拋棄了我們使用for循環(huán)的初衷,所以并不推薦大家去省略。
注意:當(dāng)條件初始化、條件判斷、條件更新都省略后,程序?qū)⑦M(jìn)入死循環(huán)。
(2)兩段有趣的代碼
//代碼1#include
int main(){ int i = 0; int j = 0; int count = 0; //這里打印多少個hehe? for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("hehe/n"); count++; } } printf("%d/n", count);} //代碼2#include
int main(){ int i = 0; int j = 0; int count = 0; //如果省略掉初始化部分,這里打印多少個hehe? for (; i < 10; i++) { for (; j < 10; j++) { printf("hehe/n"); count++; } } printf("%d/n", count);} 在這兩段代碼中,用count進(jìn)行保存hehe輸出的次數(shù),執(zhí)行程序,程序的執(zhí)行結(jié)果分別是100、10。為什么會發(fā)生這種結(jié)果呢?下面我來給大家簡單分析一下!
先看這兩段代碼,唯一的區(qū)別就是后者在二層循環(huán)中for的括號中省略了條件初始化語句,這會造成什么影響呢?我們首先看第一段代碼:首先賦初值i=0;然后進(jìn)行條件判斷,i<10,進(jìn)入到了第二層for循環(huán),第二層for循環(huán)首先對j進(jìn)行賦值操作,然后進(jìn)行條件判斷j<10,輸出hehe,count變?yōu)?,然后進(jìn)行條件更新,接著又重新進(jìn)入了條件判斷,依次循環(huán),內(nèi)層循環(huán)結(jié)束后將跳出。
此時已經(jīng)輸出了10個hehe,然后進(jìn)入了外層循環(huán)的條件更新,i++,i變?yōu)?,i<10,進(jìn)入了第二次的內(nèi)層循環(huán)。
由于此時存在條件初始化語句j又被賦值為0,重復(fù)上面的過程,又再次輸出了10個hehe,繼續(xù)重復(fù)上面的循環(huán),最終將打印10*10=100個hehe。
看代碼2,代碼2中由于不存在條件更新語句,所以在內(nèi)層循環(huán)執(zhí)行完一次之后,當(dāng)i賦值為1后進(jìn)入第二次內(nèi)層循環(huán)時,此時j的值未曾改變,依舊是10,所以內(nèi)層循環(huán)在條件判斷時直接跳出,所以最終只能打印10個hehe。
總的來說,就是代碼2相比代碼1少了條件初始化語句,所以在循環(huán)過后j的值沒有改變,依舊是上一次循環(huán)結(jié)束后的值,即10,所以在內(nèi)層循環(huán)條件判斷時直接不滿足跳出。
大家看到這相信大家也明白了,給大家展示這段代碼的意義就是希望大家不要對for語句中的三個部分進(jìn)行省略!因為錯誤的省略有時會帶來嚴(yán)重的錯誤,使我們的代碼無法實現(xiàn)我們想要它真正實現(xiàn)的功能。
(3) 多個變量控制循環(huán)
#include
int main(){ //代碼4-使用多余一個變量控制循環(huán) int x, y; for (x = 0, y = 0; x < 2 && y < 5; ++x, y++) { printf("hehe/n"); } return 0;} 條件運行結(jié)果大家也看到了,最終只打印了兩個hehe,為什么會這樣呢?因為當(dāng)x=2時就不滿足條件判斷語句(判斷滿足的條件是x<2并且x<5)了,就跳出了循環(huán),此時只進(jìn)行了2次循環(huán),打印出了兩個hehe。
這個地方呢,給大家拓展一下,如果我們把&&改為||會怎么樣呢?答案是會執(zhí)行5次循環(huán),因為如果當(dāng)x =5時就不滿足條件判斷語句(判斷滿足的條件是x<2或者x<5滿足一個條件即可)了,就跳出了循環(huán),此時只進(jìn)行了5次循環(huán),打印5個hehe。
注意:
很多同學(xué)喜歡這樣寫for循環(huán)語句:
#include
int main(){ for (int i = 0; i < 10; i++) { pritnf("hehe/n"); } return 0;} 這樣寫呢,就是進(jìn)行條件初始化的時候進(jìn)行條件定義,這樣寫不是不行,但是此時要注意i的作用域,即只在這個for循環(huán)語句內(nèi)有效,當(dāng)然,我們并不推薦這種寫法,我們推薦的是下面這種寫法:
#include
int main(){ int i = 0; for (i = 0; i < 10; i++) { pritnf("hehe/n"); } return 0;} 為什么會推薦這種寫法呢?因為我們后面可能會對i進(jìn)行判斷,判斷這個循環(huán)是否完全完成,或者判斷是否因為某些異常原因而終止了,這種代碼相對于上面第一種代碼更為實用,應(yīng)用范圍更廣,所以推薦大家使用第二種!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/123079.html
摘要:目錄循環(huán)循環(huán)語句的語法語句的語法執(zhí)行流程執(zhí)行流程語句的特點語句的特點循環(huán)中的和循環(huán)中的和練習(xí)練習(xí)計算的階乘。多層循環(huán)這種情況使用是達(dá)不到目的的。它只能從最內(nèi)層循環(huán)退出到上一層的循環(huán)。 目錄 3.3 do...while()循環(huán) 3.3.1 do語句的語法: 3.3.2 執(zhí)行流程 3.3.3...
摘要:無論實參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。函數(shù)的調(diào)用傳值調(diào)用函數(shù)的形參和實參分別占有不同內(nèi)存塊,對形參的修改不會影響實參。沒有找到找到了下標(biāo)為 目錄 1.? 函數(shù)是什么? 2.??C語言中函數(shù)的分類: 2...
摘要:判斷目標(biāo)線程是否被中斷,會清除中斷標(biāo)記。技術(shù)棧線程休眠被中斷,程序退出。示例全部信息輸出并正常退出,只是在方法被中斷并清除標(biāo)記后手動重新中斷當(dāng)前線程,然后程序接收中斷信號返回退出。通過以上個中斷示例,相信對線程中斷的概念有了全面的了解。 在之前的一文《如何優(yōu)雅地終止一個線程》中詳細(xì)說明了 stop 終止線程的壞處及如何優(yōu)雅地終止線程,那么還有別的可以終止線程的方法嗎?答案是肯定的,它就...
摘要:前陣子,我們分享了中的基本數(shù)據(jù)類型轉(zhuǎn)換這篇文章,對許多粉絲還是有帶來幫助的,今天講一下包裝類的的由來,及自動裝箱拆箱的概念和原理。下面是基本數(shù)據(jù)類型與對應(yīng)的包裝類型。 showImg(https://segmentfault.com/img/remote/1460000016537706); 前陣子,我們分享了《Java中的基本數(shù)據(jù)類型轉(zhuǎn)換》這篇文章,對許多粉絲還是有帶來幫助的,今天講...
閱讀 3766·2021-11-11 16:55
閱讀 1694·2021-10-08 10:04
閱讀 3649·2021-09-27 13:36
閱讀 2867·2019-08-30 15:53
閱讀 1921·2019-08-30 11:17
閱讀 1316·2019-08-29 16:55
閱讀 2155·2019-08-29 13:57
閱讀 2578·2019-08-29 13:13