前言
對于一個C語言菜鳥來說,說出這些話無疑是大言不慚的养叛,但我有信心也有能力為大家講好C語言,系統(tǒng)的帶大家入門C語言宰翅,也希望大家能夠相信我弃甥,支持我,在接下來的幾個月中汁讼,我會持續(xù)更新這個系列淆攻,當(dāng)然,我的筆記也會同步更新的嘿架,感謝大家的支持瓶珊!如果覺得內(nèi)容還不錯的話,點一個小小的贊和支持吧耸彪!
課前準(zhǔn)備
內(nèi)容總覽:
分支語句
if
switch
循環(huán)語句
while
for
do while
相信大家都聽說過一句話是:C語言是結(jié)構(gòu)化程序設(shè)計語言伞芹,但是為什么這么說呢?大家想一下我們生活中做一件事蝉娜,有三種情況唱较,語言表示呢,不是很好表示蜀肘,先給大家畫圖表示一下绊汹!
這個圖畫得確實不是很好稽屏,但我覺得大家應(yīng)該能了解到我的意思扮宠,這三種做事或者解決問題的方法,也分別對應(yīng)著C語言中的三種結(jié)構(gòu)(不得不感嘆最初編程設(shè)計語言的抽象概括能力)狐榔,這個地方需要告訴大家坛增,C語言中也只有這三種結(jié)構(gòu),而我們今天講的也就是分支和循環(huán)語句薄腻,對應(yīng)的也就是分支和循環(huán)結(jié)構(gòu)收捣,那么我為什么不講順序結(jié)構(gòu)呢?
因為在計算機中庵楷,在沒有分支和循環(huán)結(jié)構(gòu)參與的情況下罢艾,所有的程序都是默認的順序結(jié)構(gòu)楣颠,即程序是順序執(zhí)行的,所以順序結(jié)構(gòu)并沒有講的必要咐蚯,同時童漩,順序結(jié)構(gòu)也是我們能夠進行程序編程的基礎(chǔ)所在,也是計算機的基礎(chǔ)內(nèi)在邏輯所在春锋,從某種程度上講矫膨,在進行分支和選擇結(jié)構(gòu)的過程中,也同樣在進行著順序結(jié)構(gòu)期奔。
1.什么是語句侧馅?
C語言語句可分為以下五類:
(1)表達式語句(例如 y=x+3;假設(shè)變量y和x均已定義)
(2)函數(shù)調(diào)用語句(MAX(x,y);假設(shè)函數(shù)MAX()已經(jīng)定義)
(3)控制語句
(4)復(fù)合語句(把多種語句復(fù)合在一起形成的語句)
(5)空語句(例如 ;分號本身就可以作為一條語句,稱為空語句呐萌,至于空語句的作用馁痴,后續(xù)會講到 )
無論上述哪一種語句,都必須以分號結(jié)束肺孤!
今天介紹的分支和循環(huán)語句就是控制語句弥搞。
控制語句用于控制程序的執(zhí)行流程,以實現(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)然掠归,也有多分支選擇缅叠,如果你表白成功了,她成了你的女朋友虏冻;相反痪署,如果你表白失敗了,她說:你是個好人兄旬,如果你壓根就沒有表白狼犯,那她最終還是成為了別人的女朋友。(遇到喜歡的人就要勇敢表白哦A祛怼C跎)
2.1if語句
那if語句的語法結(jié)構(gòu)是怎么樣的呢?
if()括號中的表達式如果為真绪撵,就執(zhí)行后面的語句瓢姻;如果為假,就不執(zhí)行后面的語句音诈,去執(zhí)行else后面的語句幻碱,那么什么是真?什么是假呢细溅?
C語言規(guī)定褥傍,0為假,非0為真喇聊。
下面就代碼給大家演示一下吧恍风!
首先是單分支的情況:
然后是雙分支的情況:
接下來是多分枝的情況:
哎,很多同學(xué)們看到這就想問了誓篱,多分支情況下后面的條件判斷是不是不寫前面的age>=18也是可以的呢朋贬?很明顯當(dāng)然是可以的,因為前面不滿足age<18的時候此時age是一定大于18的了窜骄,那么此時按照道理來說锦募,我們不寫age>=18也是沒有問題的,但這個地方邻遏,推薦同學(xué)們還是要加上的糠亩,為什么呢?我們將來寫代碼党远,不僅僅是給自己看的削解,也是要給別人看的,加上之后沟娱,條理就很清晰明了,方便別人查看的同時腕柜,也有利于我們后期的維護與調(diào)試济似。
看到這矫废,相信同學(xué)們也會有這樣的疑問,就是我們在寫條件表達式(age>=18&&age<60)的時候可不可以這樣寫呢砰蠢?(18<=age<60)相信大家會有這樣的疑問蓖扑,其實有這樣的疑問也是正常的,因為我們在數(shù)學(xué)中就是這樣寫的台舱,但這樣寫到底行不行呢律杠?我們直接代碼走起!
在同學(xué)們看到第一張圖的時候竞惋,哎柜去,感覺沒問題啊,但看到第二張圖的時候拆宛,出問題了嗓奢!為什么會出現(xiàn)這種問題呢?接下來呢浑厚,我給大家分析一下股耽! 我們知道,> >= < <= == 钳幅,這些運算符都是關(guān)系運算符物蝙,如果結(jié)果為真,就返回1敢艰,如果結(jié)果為假茬末,就返回0,并且結(jié)合方向是自左向右(有關(guān)于運算符的結(jié)合方向盖矫,我會把各種運算符的結(jié)合方向以圖片的形式在本篇文章的最后分享給大家)丽惭,在第二個例子中,我們輸入了100辈双,首先對第一個if后面的表達式進行判斷责掏,很明顯,100>18,不滿足條件湃望,接下來進入了第一個else if語句進行判斷换衬,18<=100,是真的,返回1证芭,然后1<60,是真的瞳浦,最終,返回1結(jié)果是成立的废士,所以會輸出“青年”叫潦,相信大家看到這就明白了,在計算機中是不可以這樣寫的官硝,雖然語法上沒有問題矗蕊,但邏輯上卻無法正確表達我們的意思短蜕,無法滿足我們的要求,所以不要這樣使用傻咖!
看到這很多同學(xué)們又有問題了朋魔,那我們在if()的后面直接跟一個變量是不是也是可以的呢?是的卿操,完全沒有問題警检!因為上面已經(jīng)說了,c語言規(guī)定害淤,0為假扇雕,非0為真,所以在if()后面直接跟變量是完全沒有問題的筝家!如果變量值為非0洼裤,那么判斷結(jié)果為真,就執(zhí)行后面的語句溪王,如果變量值為0腮鞍,那么判斷結(jié)果為假,就不執(zhí)行后面的語句莹菱。
同時在這給大家順便提一下移国,賦值表達式的返回值是賦的值本身,即if(i = n)中(n為常數(shù))道伟,如果n為0迹缀,那么返回值為0,如果n為非0蜜徽,那么返回值為n祝懂,即返回值為非0,為真拘鞋,會執(zhí)行后面的語句砚蓬,同時告訴大家,printf和scanf函數(shù)也是有返回值的盆色,小伙伴們課下可以自己去查一下哦灰蛙!
如果大家想對if有更深入的了解的話,就可以看我另一篇有關(guān)于if的博客隔躲,那篇文章對if有個比較深入的探究摩梧!
如果條件成立,要執(zhí)行多條語句宣旱,則應(yīng)該使用代碼塊仅父!事實上,我前面就全部都使用代碼塊了,那么什么是代碼塊呢驾霜?C語言中案训,被{}括起來的叫做代碼塊买置,接下來給大家代碼展示一下粪糙,如果不用{}會怎樣潦刃!
大家都看到了融求,如果我們想在if后面跟多條語句的話,我們不用{}就會出錯钧唐,這是由C語言語法本身所決定的轩触,因為這樣的話寞酿,后面的else就沒有匹配的if了,默認情況下脱柱,if后面只能跟一條語句伐弹,而計算機把{}內(nèi)的語句當(dāng)作一條語句,所以我們如果if后面想跟多條語句的話榨为,就要用{}括起來形成一個語句塊惨好。
簡單給大家代碼展示一下:
我給大家的建議呢。就是無論后面跟的是幾條語句随闺,我們都加上{}日川,為什么這么說呢,第一個原因就是避免我們在if后面跟多條語句時可能會忘了加{}矩乐;第二個原因是就代碼塊更加簡潔有條理龄句;第三個原因就就是以后方便我們以后再向里面添加代碼。
2.1.1 懸空else
下面給大家一段代碼散罕,希望大家能夠給出輸出的結(jié)果分歇!
相信大家有人會給出"hehe" 的輸出結(jié)果,也會有人給出"haha"的輸出結(jié)果欧漱,當(dāng)然也有人會給出一些其它的結(jié)果职抡,大家都各有各的想法,這并不會讓人意外硫椰,那我告訴大家繁调,輸出結(jié)果是空白,大家會感到意外嗎靶草?大家可能會覺得我說的是假的蹄胰,那我就給大家代碼展示一下!
沒錯奕翔,輸出結(jié)果確實是空白裕寨,這個結(jié)果確實讓人感到意外,這個題中我們需要學(xué)習(xí)的知識點是,else總是跟最近的If進行匹配宾袜!
該如何理解這句話呢捻艳?我們就以下面這段代碼為例給大家解釋一下吧!
首先只看這張圖的話庆猫,很容易讓人誤解后面的這個else會跟if(a==1)進行匹配认轨,但是我們應(yīng)該記住else符合就近原則,即總跟最近的未配對的if進行匹配月培,從這個else向前找前面的if語句嘁字,首先找到的一個未配對的if語句是if(b==2),相信大家清楚了這個這個就不難理解了杉畜,下面給大家展示一下代碼的本來面目纪蜒!
看到這大家應(yīng)該都能理解了吧,首先對if(a==1)進行判斷此叠,不成立纯续,然后后面的if(b==2)與else語句均不執(zhí)行了,我們可以這么理解:if和else組成的是一個語句 灭袁。
實際上猬错,這個代碼我們還能夠去改進一下,使這個代碼變得更加的清晰简卧,更加的方便我們的理解:
這樣加上一個代碼塊是不是更有助于大家的理解了呢兔魂? 所以代碼規(guī)范很重要!
這個地方呢举娩,希望大家能夠養(yǎng)成良好的代碼書寫風(fēng)格析校,使代碼美觀、符合規(guī)范铜涉、并且容易理解智玻!在這給大家推薦一本書,叫《高質(zhì)量的C-C++編程》芙代,里面有很多良好的代碼書寫風(fēng)格還有一些好的習(xí)慣吊奢,大家可以去網(wǎng)上找一找,應(yīng)該使可以找到電子版的纹烹,如果有時間页滚,我也會根據(jù)書上的內(nèi)容寫一些相關(guān)的博客!如果大家實在找不到铺呵,就在評論區(qū)告訴我裹驰,我會分享在評論區(qū)的。
2.1.2if書寫形式的對比
首先大家看代碼1和代碼2片挂,它們表達的意思是完全一樣的幻林,就是如果condition條件成立贞盯,就執(zhí)行return x;語句返回x,反之不成立就執(zhí)行return y;返回y,但是代碼塊2表達意思就比代碼塊1更容易理解,邏輯也更加的清晰沪饺,希望大家在寫代碼的時候能像代碼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,它們表達的意思是完全一樣的整葡,那我為什么還要給大家講這個點呢件余?是因為老是有很多同學(xué)在寫if(num==5)使寫成了if(num=5),注意雖然前后兩者的結(jié)果是一樣的(后面表達式是否執(zhí)行),但它們所表達的意思卻是完全不同的掘宪,前者是進行判斷蛾扇,而后者是進行賦值攘烛,執(zhí)行完這條語句之后魏滚,前者的num的值并沒有發(fā)生任何改變,而后者無論原先num的值是否為5坟漱,在執(zhí)行完if(num=5)之后鼠次,num的值都將變成5。
它們的判定結(jié)果確實是一樣的芋齿,為什么呢腥寇?前面已經(jīng)給大家說了,賦值表達式的返回結(jié)果是所賦的那個值觅捆,在第二個語句中賦的值為5赦役,所以返回值為5,是非零的數(shù)栅炒,為真掂摔,而前者因為num本身就等于5了,所以判定結(jié)果為真赢赊,兩者都為真乙漓,均執(zhí)行后面的語句。
這兩種寫法第二種雖然是錯誤的释移,但結(jié)果確是正確的叭披,但所造成的后果卻是截然不同的,希望大家能夠注意玩讳!
然后給大家講講為什么我要給大家展示代碼3和代碼4涩蜘,按照我們正常的邏輯來說,我們應(yīng)該會像代碼3這樣寫熏纯,但前面已經(jīng)給大家說了同诫,代碼3這樣寫我們會很容易寫成if(num=5),從而改變了變量的值,那為什么要寫成代碼4這樣呢豆巨?就是為了避免犯這樣的錯誤剩辟!給大家代碼展示一下大家就明白了!
在這種情況下,如果我們還是按照錯誤的方法去寫贩猎,很明顯程序就報錯了熊户,為什么會報錯呢?我們只能給變量賦值吭服,即我們書寫賦值語句的時候嚷堡,=左邊必須是變量,而不能是常量艇棕!這樣編譯器一旦提示我們程序錯誤蝌戒,我們一檢查,就知道自己又犯了老錯誤沼琉,就能及時更正過來北苟!所以推薦大家在寫if()里面的條件判斷表達式時,將常量放在關(guān)系運算符的左邊打瘪!
好了友鼻,今天的分支和循環(huán)(1)就到這了,如果大家覺得不錯的話闺骚,點個小小的贊和關(guān)注吧彩扔,后面還會持續(xù)更新哦!
給大家分享的操作符結(jié)合性順序表: