大家好~~~我是開心學編程,學到無極限的@jxwd😀
寫在前面
各位小伙伴還在為C語言的學習而苦惱嘛?
還在為沒有知識體系而煩心嘛?
別急,因為~~~~
接下來的兩個多月,我會持續推出C語言的有關知識內容,都是滿滿的干貨,從零基礎開始哦~,循序漸進😀,直至將C中知識基本全部學完🐂,關注我?,訂閱專欄 0基礎C語言保姆教學,就可以持續讀到我的文章啦😀🐕~~~~
本文為萬字長文,滿滿干貨,為防止找不到,可以收藏再看呦😀
本文為第三節
接下來,就將會詳細地介紹上一節每個模塊的內容,
本節,我們將會來介紹分支陳述句和回圈陳述句,
本節內容有:
目錄
什么是陳述句
陳述句的分類
分支陳述句(選擇陳述句)
if陳述句
懸空else
關于if陳述句的幾點代碼書寫的建議
switch陳述句
基本語法形式
break和default陳述句
注意事項
回圈陳述句
while回圈
基本構架
break與continue
for回圈
基本語法構建
for回圈里的break于continue
for回圈書寫建議
do....while回圈
基本語法形式
特點
do....while回圈里的continue與break
goto陳述句
什么是陳述句
陳述句實際上就相當于一個完整的指令,對計算機的指令,
陳述句的分類
C中的陳述句可以分為以下五大類:
- 運算式陳述句;
- 函式陳述句;
- 控制陳述句;
- 復合陳述句;
- 空陳述句,
我們今天就來介紹控制陳述句,
控制陳述句可以分為以下三類
分支陳述句(條件判斷陳述句):if switch
回圈陳述句: for while do.....while
轉向陳述句:goto break return
分支陳述句(選擇陳述句)
我們的生活中面臨著很多選擇,也叫不同的分支:
比如,我想做下面的一種選擇,我在大學是談個戀愛還是好好學習?(假如只能夠二選一)
它的基本邏輯形式可以是這樣的:

(圖一)
這就是選擇陳述句,那么我如果想在以代碼的方式來實作,應當如何做呢?------答案就是應分支陳述句,
接下來,我們介紹常用的兩種分支陳述句:if陳述句和switch陳述句
if陳述句
if陳述句的基本語法形式:

(圖二)
需要注意的是,這里的運算式1為判斷陳述句,
還可以是這樣兩種情況:
即

(圖三)
和

(圖四)
我們來用代碼實作一下:

(圖五)
按ctrl+(fn+)f5,讓程式運行,

(圖六)
現在如果我們輸入1,那么將會輸出(如圖七):

(圖七)
那我們輸入2呢?(如圖八)

(圖八)
那有沒有人想問了,如果我輸入3呢?就是不輸入1或者2,結果會怎樣?
我們來試一下(如圖九)

(圖九)
我們發現,它仍然是列印else里面的部分,
原因很簡單,就是因為代碼執行到 if (a==1) 時,它會判斷a是否為1,而它的判斷邏輯是這樣的:
a若為1,則為真,執行if里面的陳述句,
a若不為1,則為假,跳過if,直接進入else的部分中,執行else部分的陳述句,
我們提一嘴,何為真,何為假?
在C語言中,0表示假,非0表示真,
而在vs的環境中,如果條件判斷為真,則回傳1,如果條件判斷為假,則回傳0,
也就是說,
當執行到if(a==1)時,進行判斷,若條件為真,則回傳1,即變成 if(1) ;
否則,回傳0,即if(0),
當為真時,則執行if里的陳述句,當為假時,則跳過if陳述句里的內容,執行下面的內容,
我們還可以來看一下下面的代碼,以加深理解,

(圖十)
我們來分析一下,這個代碼是怎么運行的(看圖十一),

(圖十一)
那如果我輸入20呢?(圖十二給出答案)

(圖十二)
好,我們下面來看看懸空else,
懸空else
主要意識是說,當有多個else時,else會最先與最近的未被匹配的 if 配對
比如,來看下面一段代碼:

(圖十三)
請問,它會輸出什么?
我們來運行一下看看

(圖十四)
發現它什么也沒有輸出
為啥?
很簡單,就是剛剛的原因:else與上面離它最近的未比配的if匹配,
所以,當程式運行到if(a==1)上時,判斷為假,跳過if,直接運行到return 0,
里面的if(b==2)和else的陳述句都是if(a==1)的內容,
也就是說,它等價于下面的代碼:(圖十五)

(圖十五)
如果我們想讓其列印出haha ,代碼應該是這么寫的,

(圖十六)
這其實和我們的代碼書寫規范以及書寫習慣有很大的關系,而我們接下來就會給大家講講這個東西,
好,我們有關if陳述句的語法到此為止全部介紹完畢,
關于if陳述句的幾點代碼書寫的建議
1、每一句的 if 和 else 后面最好都跟上一個大括號,不論有幾條陳述句(哪怕只有一條),
說一下,這里的{}意為一個代碼塊,可以理解為一整個陳述句,
之所以這樣建議,有如下幾點理由:
1)看著舒服,看著整齊,
2)不會出現像上文說的那樣else,if混搭的情況,而加上了{}則不會出現這種情況,并且這種情況正是在書寫不規范的情況下產生的,
3)這是一種規范對仗的書寫方式,如果再要增加陳述句的時候不用再去打括號了,極為方便,
4)大大增加可讀性,如果不加,如果if或者else后面有陳述句跟著,很難一眼辨認是否執行(不要不信,這可是筆者親自實驗過,當代碼量大、不停地看的時候,你真的會發現,帶上大括號看著真的是舒服,哪怕只有一條陳述句)
5)在未來我們寫一些其他的陳述句的時候,會發現閱讀時哪怕是只有一條陳述句沒有{}也看起來是一件很難受的事情,所以不值得提倡,
有這么多好處,為啥不養成好的習慣呢?
如果有人反對說反而看著凌亂,這筆者認為這種觀點就跑遠了,每一個if/else后面都跟著一個小弟(即{}),那么漂亮而又整齊的縮進,怎么會顯得凌亂呢,不應該更顯整齊么?
2、我們寫出if后如果不跟else,看一下是否跟上else會更能增加代碼的可讀性,
我們舉個例子來理解:


(圖十七)
來對比一下,哪一種代碼更好?或者說哪一種代碼的可讀性更高?(當然我們暫時不考慮其能否正常運行)
顯然是第2種(即圖十七右圖),
因為第一種你一眼看過去很難判斷出來回傳x還是y,但是如果采用第二種,看著便會舒服地多😀
總的來說,我們的代碼寫的越對仗、if-else用的越整齊,會顯得代碼看著越舒服,可讀性更高,即我要思考代碼下一步該執行哪行的時間減少了,
3、如果寫判斷是否相等,可以考慮把常數寫在左邊,變數寫在右邊,(建議)
if里條件判斷是否相等一定要寫 ==;
我們如果寫if(a==5),如果寫成if(a=5),會發現編譯器也不會報錯,
但是,我條件判斷如果寫成if(5==a),這個時候我如果寫成if(5=a),就是把兩個等號寫成一個等號時,編譯器就會報錯,這樣就不會自己坑自己了~~哈哈,
不過,我們以后寫代碼可能都會寫成if(!a)這樣的形式;不過當我們寫成判斷是否相等時,把常量寫在左邊、變數寫在右邊是避免出錯的一種可以考慮采納的方式,
switch陳述句
基本語法形式

(圖十八)
它有什么用?
來看這樣一個輸入輸出樣例:
輸入1,輸出星期一
輸入2,輸出星期二
輸入3,輸出星期三
輸入4,輸出星期四
輸入5,輸出星期五
輸入6,輸出星期六
輸入7,輸出星期日
這怎么弄?
難不成我們需要一條一條的來用 if 寫?
這不太挫了么......?
有沒有什么其他更好的方法?
當然是有的,這就是switch陳述句
我們可以將上面的陳述句以這樣的方式來寫:

(圖十九)
(注:上圖中case2 的case和2中間應當有個空格,筆者圖弄好才發現,懶得改了~~哈哈)
我們來運行看一下:

(圖二十)
那我如果輸入的不是7,而是3呢?
我們來看一下:(如圖二十一)

(圖二十一)
為啥會輸出來的不是星期三,而是這么多一串?
這個就關系到了我們接下來要講的break陳述句了,請往下看,
break和default陳述句
我們回到剛剛的那個話題:
為啥會這樣?
因為,switch陳述句是這樣執行的,(如圖二十二)

(圖二十二)
(呃...上面幾個圖的return 0應該在switch陳述句{}的外面,我也是寫到這里才發現,讀者注意即可,筆者不刻意改了,哈哈~~~~)
那我們要它只輸出星期三,應該怎么辦呢?
這個時候,break陳述句的作用就出現了:

(圖二十三)
如上圖,當遇到break的時候,就會直接跳出switch回圈,這樣,我們就能只列印 星期三 了,
總結來說,就是:break陳述句 的實際效果是把陳述句串列劃分為不同的分支部分,
我們標題中還提到了一個關鍵字:default,這個是什么意思?
我們想一下,如果你所輸入的數,當對所有的case都不滿足情況的時候,怎么辦?
這個時候,程式并不會報錯,而是直接跳過所有的case,
但這時如果我們有default的時候,則執行default,
比如,還是上面的例子,我們加上一個default,這個時候,我們輸入8,則會執行default里的陳述句(如圖二十四),

(圖二十四)
注意事項
1、為養成好習慣,最好在每一條的case陳述句中的后面都加上一個break;以防止出現圖二十一的那種情況,
2、多個case陳述句可以共用一條(或者多條)執行陳述句,
什么意思?比如,我現在需求變了:
我想讓輸入1~5的時候輸出作業日;
在輸入6、7的時候輸出周末,
難道我每一個case的后面都要跟著一個printf么?
太繁瑣,顯然不用,
我們可以這樣寫(如圖二十五):

(圖二十五)
3、case和default沒有強制的位置關系,就是說default不一定要放在最后,放在哪里都可以,
回圈陳述句
說完了選擇分支,我們再來說說回圈陳述句,
回圈陳述句包含while回圈、do....while回圈和for回圈
while回圈
基本構架
while回圈我們之前介紹過,它的基本構架是這個樣子的:

(圖二十六)
同理,這里的exp1為條件判斷陳述句
回圈結構是這樣的:

(圖二十六)
我們來看這樣一個例子:
我們來在螢屏上列印一下1-100的數字:(如圖二十七)

(圖二十七)
(住:右邊的輸出只截取了部分,截不下了)
break與continue
下面的圖二十八還是借鑒剛剛上面那個圖(圖二十六)

(圖二十八)
for回圈
基本語法構建

(圖二十九)

(圖三十)
我們來簡單的舉一個例子:

(圖三十一)

(圖三十二)
所以,毫無疑問,它將會輸出0 1 2

(圖三十三)
for回圈里的break于continue
在for回圈里,break和continue的用法與在while回圈里相同
我們來看下面一個例子:


(圖三十四)
請問,左右兩個代碼分別會輸出什么?


(圖三十五)
我們可以看到,左邊的正常輸出了0-9,但是右邊卻進入了死回圈,
相信通過前面的介紹,讀者可以自行分析出原因所在了,
而這個例子,很好的對比了for和while回圈的特點,
for回圈書寫建議
1、在回圈體里不要輕易改變回圈變數,
2、建議把條件判斷寫成前閉后開的形式,
具體的來說一下:
第一點的意思:比如,你這樣寫一個for回圈:
for( int i = 0; i < 10; i ++)
{
if ( i > 5 )
{
i = 5;
}
else
{
printf( "%d" , i );
}
return 0;
}
這顯然是有bug的,顯然是一個死回圈,
所以筆者剛剛的意思就是說,在for回圈的回圈體的內部,不要輕易改變i 的值,因為這樣弄不好就弄成了個死回圈,
第二個,意思是說,比如我要回圈5次,建議寫成下面第一行的形式,而不是第二行的形式
for ( int i = 0; i < 5; i++) //建議
for ( int i = 1; i <= 5; i++) //不建議
為什么這樣說?因為第一行我們可以一眼看出來就是5次,又或者說是一種標準吧,
需要指出的是,在這里,筆者只是建議,具體的如果寫成第二種明顯更好的或者有寫第二種的需求的當然以更好的方式以及需求優先,
do....while回圈
基本語法形式

(圖三十六)
特點
這個回圈的最大的特點就是回圈體會至少執行一次
因使用場景有限,我們不常用,
我們最常用的是for回圈,
do....while回圈里的continue與break
這里的continue和break與上面我們說的for回圈和while回圈邏輯相同,
我們就舉個例子吧:


(圖三十七)
很明顯,左邊的是先打出10 9 8 7 6,然后接著一個死回圈,而右邊列印除10 9 8 7 6
goto陳述句
關于goto陳述句,我們簡單提一下:
C語言中提供了可以隨意濫用的 goto陳述句和標記跳轉的標號,
從理論上, goto陳述句是沒有必要的,實踐中沒有goto陳述句也可以很容易的寫出代碼,
但是某些場合下goto陳述句還是用得著的,最常見的用法就是終止程式在某些深度嵌套的結構的處理程序,
例如:一次跳出兩層或多層回圈,多層回圈這種情況使用break是達不到目的的,因為它只能從最內層回圈退出到上一層的回圈,
它的作用就是直接去跳轉,理論上想到哪就到哪,
我們來舉個栗子:
情景是這樣的:
現在視窗有提示:您的電腦將在1分鐘后關機,除非輸入:我是一只豬

(我們這里僅展示關鍵部分,理解即可)
圖(三十八)
那么我如果進入了else,就會goto(到)again那一行,然后繼續執行printf里面的代碼,
建議大家學完本節內容后可以再去聯系聯系代碼能力,上牛客、洛谷等網站找一些入門的題做一做,比如二分法查找等等,
好了,本節內容就到這里啦,我是@jxwd(健祥無敵),關注我,訂閱專欄,就可以第一時間享我的原創文章啦😀~~~
還是那句口號:jxwd,讓你服氣,拒絕水文,從我做起!與各位共勉!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342042.html
標籤:其他
