前言
對(duì)于一個(gè)C語言菜鳥來說,說出這些話無疑是大言不慚的,但我有信心也有能力為大家講好C語言,系統(tǒng)的帶大家入門C語言,也希望大家能夠相信我,支持我,在接下來的幾個(gè)月中,我會(huì)持續(xù)更新這個(gè)系列,當(dāng)然,我的筆記也會(huì)同步更新的,感謝大家的支持!如果覺得內(nèi)容還不錯(cuò)的話,點(diǎn)一個(gè)小小的贊和支持吧!
課前準(zhǔn)備
內(nèi)容總覽:
分支語句
if
switch
循環(huán)語句
while
for
do while
相信大家都聽說過一句話是:C語言是結(jié)構(gòu)化程序設(shè)計(jì)語言,但是為什么這么說呢?大家想一下我們生活中做一件事,有三種情況,語言表示呢,不是很好表示,先給大家畫圖表示一下!

這個(gè)圖畫得確實(shí)不是很好,但我覺得大家應(yīng)該能了解到我的意思,這三種做事或者解決問題的方法,也分別對(duì)應(yīng)著C語言中的三種結(jié)構(gòu)(不得不感嘆最初編程設(shè)計(jì)語言的抽象概括能力),這個(gè)地方需要告訴大家,C語言中也只有這三種結(jié)構(gòu),而我們今天講的也就是分支和循環(huán)語句,對(duì)應(yīng)的也就是分支和循環(huán)結(jié)構(gòu),那么我為什么不講順序結(jié)構(gòu)呢?
因?yàn)樵谟?jì)算機(jī)中,在沒有分支和循環(huán)結(jié)構(gòu)參與的情況下,所有的程序都是默認(rèn)的順序結(jié)構(gòu),即程序是順序執(zhí)行的,所以順序結(jié)構(gòu)并沒有講的必要,同時(shí),順序結(jié)構(gòu)也是我們能夠進(jìn)行程序編程的基礎(chǔ)所在,也是計(jì)算機(jī)的基礎(chǔ)內(nèi)在邏輯所在,從某種程度上講,在進(jìn)行分支和選擇結(jié)構(gòu)的過程中,也同樣在進(jìn)行著順序結(jié)構(gòu)。
1.什么是語句?
C語言語句可分為以下五類:
(1)表達(dá)式語句(例如 y=x+3;假設(shè)變量y和x均已定義)
(2)函數(shù)調(diào)用語句(MAX(x,y);假設(shè)函數(shù)MAX()已經(jīng)定義)
(3)控制語句
(4)復(fù)合語句(把多種語句復(fù)合在一起形成的語句)
(5)空語句(例如 ;分號(hào)本身就可以作為一條語句,稱為空語句,至于空語句的作用,后續(xù)會(huì)講到 )
無論上述哪一種語句,都必須以分號(hào)結(jié)束!
今天介紹的分支和循環(huán)語句就是控制語句。
控制語句用于控制程序的執(zhí)行流程,以實(shí)現(xiàn)程序的各種結(jié)構(gòu)方式,它們由特定的語句定義符組成,C語言有九種控制語句。
可分成以下三類:
1. 條件判斷語句(也叫分支語句):if語句、switch語句;
2. 循環(huán)執(zhí)行語句:do while語句、while語句、for語句;
3. 轉(zhuǎn)向語句:break語句、goto語句、continue語句、return語句。
2、分支語句(選擇結(jié)構(gòu))

你遇到了你喜歡的女生,如果你表白了,她成了你的女朋友,你和她在一起了;
如果你沒有表白,她成了別人的女朋友,你看著她躺在別人的懷里,后悔莫及。
這就是選擇!

當(dāng)然,也有多分支選擇,如果你表白成功了,她成了你的女朋友;相反,如果你表白失敗了,她說:你是個(gè)好人,如果你壓根就沒有表白,那她最終還是成為了別人的女朋友。(遇到喜歡的人就要勇敢表白哦?。。?/p>
2.1if語句
那if語句的語法結(jié)構(gòu)是怎么樣的呢?

if()括號(hào)中的表達(dá)式如果為真,就執(zhí)行后面的語句;如果為假,就不執(zhí)行后面的語句,去執(zhí)行else后面的語句,那么什么是真?什么是假呢?
C語言規(guī)定,0為假,非0為真。
下面就代碼給大家演示一下吧!
首先是單分支的情況:

然后是雙分支的情況:

接下來是多分枝的情況:

哎,很多同學(xué)們看到這就想問了,多分支情況下后面的條件判斷是不是不寫前面的age>=18也是可以的呢?很明顯當(dāng)然是可以的,因?yàn)榍懊娌粷M足age<18的時(shí)候此時(shí)age是一定大于18的了,那么此時(shí)按照道理來說,我們不寫age>=18也是沒有問題的,但這個(gè)地方,推薦同學(xué)們還是要加上的,為什么呢?我們將來寫代碼,不僅僅是給自己看的,也是要給別人看的,加上之后,條理就很清晰明了,方便別人查看的同時(shí),也有利于我們后期的維護(hù)與調(diào)試。
看到這,相信同學(xué)們也會(huì)有這樣的疑問,就是我們?cè)趯憲l件表達(dá)式(age>=18&&age<60)的時(shí)候可不可以這樣寫呢?(18<=age<60)相信大家會(huì)有這樣的疑問,其實(shí)有這樣的疑問也是正常的,因?yàn)槲覀冊(cè)跀?shù)學(xué)中就是這樣寫的,但這樣寫到底行不行呢?我們直接代碼走起!


在同學(xué)們看到第一張圖的時(shí)候,哎,感覺沒問題啊,但看到第二張圖的時(shí)候,出問題了!為什么會(huì)出現(xiàn)這種問題呢?接下來呢,我給大家分析一下! 我們知道,> >= < <= == ,這些運(yùn)算符都是關(guān)系運(yùn)算符,如果結(jié)果為真,就返回1,如果結(jié)果為假,就返回0,并且結(jié)合方向是自左向右(有關(guān)于運(yùn)算符的結(jié)合方向,我會(huì)把各種運(yùn)算符的結(jié)合方向以圖片的形式在本篇文章的最后分享給大家),在第二個(gè)例子中,我們輸入了100,首先對(duì)第一個(gè)if后面的表達(dá)式進(jìn)行判斷,很明顯,100>18,不滿足條件,接下來進(jìn)入了第一個(gè)else if語句進(jìn)行判斷,18<=100,是真的,返回1,然后1<60,是真的,最終,返回1結(jié)果是成立的,所以會(huì)輸出“青年”,相信大家看到這就明白了,在計(jì)算機(jī)中是不可以這樣寫的,雖然語法上沒有問題,但邏輯上卻無法正確表達(dá)我們的意思,無法滿足我們的要求,所以不要這樣使用!
看到這很多同學(xué)們又有問題了,那我們?cè)趇f()的后面直接跟一個(gè)變量是不是也是可以的呢?是的,完全沒有問題!因?yàn)樯厦嬉呀?jīng)說了,c語言規(guī)定,0為假,非0為真,所以在if()后面直接跟變量是完全沒有問題的!如果變量值為非0,那么判斷結(jié)果為真,就執(zhí)行后面的語句,如果變量值為0,那么判斷結(jié)果為假,就不執(zhí)行后面的語句。
同時(shí)在這給大家順便提一下,賦值表達(dá)式的返回值是賦的值本身,即if(i = n)中(n為常數(shù)),如果n為0,那么返回值為0,如果n為非0,那么返回值為n,即返回值為非0,為真,會(huì)執(zhí)行后面的語句,同時(shí)告訴大家,printf和scanf函數(shù)也是有返回值的,小伙伴們課下可以自己去查一下哦!
如果大家想對(duì)if有更深入的了解的話,就可以看我另一篇有關(guān)于if的博客,那篇文章對(duì)if有個(gè)比較深入的探究!
如果條件成立,要執(zhí)行多條語句,則應(yīng)該使用代碼塊!事實(shí)上,我前面就全部都使用代碼塊了,那么什么是代碼塊呢?C語言中,被{}括起來的叫做代碼塊,接下來給大家代碼展示一下,如果不用{}會(huì)怎樣!

大家都看到了,如果我們想在if后面跟多條語句的話,我們不用{}就會(huì)出錯(cuò),這是由C語言語法本身所決定的,因?yàn)檫@樣的話,后面的else就沒有匹配的if了,默認(rèn)情況下,if后面只能跟一條語句,而計(jì)算機(jī)把{}內(nèi)的語句當(dāng)作一條語句,所以我們如果if后面想跟多條語句的話,就要用{}括起來形成一個(gè)語句塊。
簡單給大家代碼展示一下:

我給大家的建議呢。就是無論后面跟的是幾條語句,我們都加上{},為什么這么說呢,第一個(gè)原因就是避免我們?cè)趇f后面跟多條語句時(shí)可能會(huì)忘了加{};第二個(gè)原因是就代碼塊更加簡潔有條理;第三個(gè)原因就就是以后方便我們以后再向里面添加代碼。
2.1.1 懸空else
下面給大家一段代碼,希望大家能夠給出輸出的結(jié)果!

相信大家有人會(huì)給出"hehe" 的輸出結(jié)果,也會(huì)有人給出"haha"的輸出結(jié)果,當(dāng)然也有人會(huì)給出一些其它的結(jié)果,大家都各有各的想法,這并不會(huì)讓人意外,那我告訴大家,輸出結(jié)果是空白,大家會(huì)感到意外嗎?大家可能會(huì)覺得我說的是假的,那我就給大家代碼展示一下!

沒錯(cuò),輸出結(jié)果確實(shí)是空白,這個(gè)結(jié)果確實(shí)讓人感到意外,這個(gè)題中我們需要學(xué)習(xí)的知識(shí)點(diǎn)是,else總是跟最近的If進(jìn)行匹配!
該如何理解這句話呢?我們就以下面這段代碼為例給大家解釋一下吧!
首先只看這張圖的話,很容易讓人誤解后面的這個(gè)else會(huì)跟if(a==1)進(jìn)行匹配,但是我們應(yīng)該記住else符合就近原則,即總跟最近的未配對(duì)的if進(jìn)行匹配,從這個(gè)else向前找前面的if語句,首先找到的一個(gè)未配對(duì)的if語句是if(b==2),相信大家清楚了這個(gè)這個(gè)就不難理解了,下面給大家展示一下代碼的本來面目!

看到這大家應(yīng)該都能理解了吧,首先對(duì)if(a==1)進(jìn)行判斷,不成立,然后后面的if(b==2)與else語句均不執(zhí)行了,我們可以這么理解:if和else組成的是一個(gè)語句 。
實(shí)際上,這個(gè)代碼我們還能夠去改進(jìn)一下,使這個(gè)代碼變得更加的清晰,更加的方便我們的理解:

這樣加上一個(gè)代碼塊是不是更有助于大家的理解了呢? 所以代碼規(guī)范很重要!
這個(gè)地方呢,希望大家能夠養(yǎng)成良好的代碼書寫風(fēng)格,使代碼美觀、符合規(guī)范、并且容易理解!在這給大家推薦一本書,叫《高質(zhì)量的C-C++編程》,里面有很多良好的代碼書寫風(fēng)格還有一些好的習(xí)慣,大家可以去網(wǎng)上找一找,應(yīng)該使可以找到電子版的,如果有時(shí)間,我也會(huì)根據(jù)書上的內(nèi)容寫一些相關(guān)的博客!如果大家實(shí)在找不到,就在評(píng)論區(qū)告訴我,我會(huì)分享在評(píng)論區(qū)的。
2.1.2if書寫形式的對(duì)比
首先大家看代碼1和代碼2,它們表達(dá)的意思是完全一樣的,就是如果condition條件成立,就執(zhí)行return x;語句返回x,反之不成立就執(zhí)行return y;返回y,但是代碼塊2表達(dá)意思就比代碼塊1更容易理解,邏輯也更加的清晰,希望大家在寫代碼的時(shí)候能像代碼2一樣這樣寫!
//代碼1
if (condition) {
return x;
}
return y;
//代碼2
if(condition)
{
return x;
}
else
{
return y;
}
//代碼3
int num = 5;
if(num == 5)
{
printf("hehe\n");
}
//代碼4
int num = 5;
if(5 == num)
{
printf("hehe\n");
}
接下來大家看代碼3和代碼4,它們表達(dá)的意思是完全一樣的,那我為什么還要給大家講這個(gè)點(diǎn)呢?是因?yàn)槔鲜怯泻芏嗤瑢W(xué)在寫if(num==5)使寫成了if(num=5),注意雖然前后兩者的結(jié)果是一樣的(后面表達(dá)式是否執(zhí)行),但它們所表達(dá)的意思卻是完全不同的,前者是進(jìn)行判斷,而后者是進(jìn)行賦值,執(zhí)行完這條語句之后,前者的num的值并沒有發(fā)生任何改變,而后者無論原先num的值是否為5,在執(zhí)行完if(num=5)之后,num的值都將變成5。
它們的判定結(jié)果確實(shí)是一樣的,為什么呢?前面已經(jīng)給大家說了,賦值表達(dá)式的返回結(jié)果是所賦的那個(gè)值,在第二個(gè)語句中賦的值為5,所以返回值為5,是非零的數(shù),為真,而前者因?yàn)閚um本身就等于5了,所以判定結(jié)果為真,兩者都為真,均執(zhí)行后面的語句。
這兩種寫法第二種雖然是錯(cuò)誤的,但結(jié)果確是正確的,但所造成的后果卻是截然不同的,希望大家能夠注意!
然后給大家講講為什么我要給大家展示代碼3和代碼4,按照我們正常的邏輯來說,我們應(yīng)該會(huì)像代碼3這樣寫,但前面已經(jīng)給大家說了,代碼3這樣寫我們會(huì)很容易寫成if(num=5),從而改變了變量的值,那為什么要寫成代碼4這樣呢?就是為了避免犯這樣的錯(cuò)誤!給大家代碼展示一下大家就明白了!

在這種情況下,如果我們還是按照錯(cuò)誤的方法去寫,很明顯程序就報(bào)錯(cuò)了,為什么會(huì)報(bào)錯(cuò)呢?我們只能給變量賦值,即我們書寫賦值語句的時(shí)候,=左邊必須是變量,而不能是常量!這樣編譯器一旦提示我們程序錯(cuò)誤,我們一檢查,就知道自己又犯了老錯(cuò)誤,就能及時(shí)更正過來!所以推薦大家在寫if()里面的條件判斷表達(dá)式時(shí),將常量放在關(guān)系運(yùn)算符的左邊!
好了,今天的分支和循環(huán)(1)就到這了,如果大家覺得不錯(cuò)的話,點(diǎn)個(gè)小小的贊和關(guān)注吧,后面還會(huì)持續(xù)更新哦!
給大家分享的操作符結(jié)合性順序表:


