一斋扰、C語言的結(jié)構(gòu)
1、Hello world
簡單來說央星,一個C程序就是由若干頭文件和函數(shù)組成霞怀。
#include<stdio.h> //包含頭文件
/*
*主函數(shù)
*/
int main(){
printf("Hello World");
return 0;
}
#include <stdio.h>
就是一條預處理命令,它的作用是通知C語言編譯系統(tǒng)在對C程序進行正式編譯之前需做一些預處理工作等曼。
函數(shù)就是實現(xiàn)代碼邏輯的一個小的單元里烦。
注:在最新的C標準中,main函數(shù)前的類型為int而不是void禁谦。
2胁黑、主函數(shù)
一個C程序有且只有一個主函數(shù),即main函數(shù)州泊。主函數(shù)就是C語言中的唯一入口丧蘸。
3、編寫規(guī)范
1.一個說明或一個語句占一行,例如:包含頭文件力喷、一個可執(zhí)行語句結(jié)束都需要換行刽漂;
2.函數(shù)體內(nèi)的語句要有明顯縮進,通常以按一下Tab鍵為一個縮進弟孟;
3.括號要成對寫贝咙,如果需要刪除的話也要成對刪除;
4.當一句可執(zhí)行語句結(jié)束的時候末尾需要有分號拂募;
5.代碼中所有符號均為英文半角符號庭猩。
4、注釋
#include<stdio.h> //包含頭文件
/*
*主函數(shù)
*/
int main(){
printf("Hello World");
return 0;
}
如上面兩種注釋//和 /**/陈症。
5蔼水、標識符
編程時給變量或者函數(shù)起的名字就是標識符,就好比我們慕課網(wǎng)的每一位童鞋都有姓名录肯,姓名就是這位童鞋的標識符趴腋。C語言的標識符是不可以隨便起名字的,必須遵守一定的規(guī)則论咏。
C 語言規(guī)定优炬,標識符可以是字母(A~Z,a~z)潘靖、數(shù)字(0~9)穿剖、下劃線_組成的字符串蚤蔓,并且第一個字符必須是字母或下劃線卦溢。在使用標識符時還有注意以下幾點:
1.標識符的長度最好不要超過8位,因為在某些版本的C中規(guī)定標識符前8位有效秀又,當兩個標識符前8位相同時单寂,則被認為是同一個標識符。
2.標識符是嚴格區(qū)分大小寫的吐辙。例如Imooc和imooc 是兩個不同的標識符宣决。
3.標識符最好選擇有意義的英文單詞組成做到"見名知意",不要使用中文昏苏。
4.標識符不能是C語言的關(guān)鍵字尊沸。
6、基本數(shù)據(jù)類型
在我們玩游戲的時候贤惯,游戲中的角色是有類型的洼专,有敏捷型、力量型孵构、法術(shù)型等等屁商。同樣C語言中的數(shù)據(jù)也是有類型的,C語言中颈墅,數(shù)據(jù)類型可分為:基本數(shù)據(jù)類型蜡镶,構(gòu)造數(shù)據(jù)類型雾袱,指針類型,空類型四大類官还。如圖所示:
這里我們先給大家講解基本數(shù)據(jù)類型中最簡單也是最常用的整型芹橡、實型與字符型。
整型數(shù)據(jù)是指不帶小數(shù)的數(shù)字望伦。生活中有很多信息適合使用整型數(shù)據(jù)來表示僻族,比如:人的年齡、班級的人數(shù)屡谐、書的總頁數(shù)等等述么。因此整型的類型比較多:
注:int、short int愕掏、long int是根據(jù)編譯環(huán)境的不同度秘,所取范圍不同。而其中short int和long int至少是表中所寫范圍饵撑,但是int在表中是以16位編譯環(huán)境寫的取值范圍剑梳。另外
c語言int的取值范圍在于他占用的字節(jié)數(shù) ,不同的編譯器滑潘,規(guī)定是不一樣垢乙。ANSI標準定義int是占2個字節(jié),TC是按ANSI標準的语卤,它的int是占2個字節(jié)的追逮。但是在VC里,一個int是占4個字節(jié)的粹舵。
浮點數(shù)據(jù)是指帶小數(shù)的數(shù)字钮孵。生活中有很多信息適合使用浮點型數(shù)據(jù)來表示,比如:人的體重(單位:公斤)眼滤、商品價格巴席、圓周率等等。因為精度的不同又分為3種:
注:C語言中不存在字符串變量诅需,字符串只能存在字符數(shù)組中漾唉,這個后面會講。
6堰塌、格式化輸出語句
格式化輸出語句赵刑,也可以說是占位輸出,是將各種類型的數(shù)據(jù)按照格式化后的類型及指定的位置從計算機上顯示蔫仙。這樣做的好處料睛,是有利于計算機能夠準確的將我們所要類型數(shù)據(jù)給我們。
其格式為:printf("輸出格式符",輸出項);
C語言中的常用格式化符:
當輸出語句中包含普通字符時恤煞,可以采用一下格式:
printf("普通字符輸出格式符", 輸出項);
例如:
輸出結(jié)果為:
a=10
如果要輸出多個變量的并指定變量的位置時候屎勘,格式符還可以連用,變量之間需要用逗號隔開居扒,如:
輸出結(jié)果為:
整數(shù):10概漱,小數(shù):7.560000,字符:c
注意:格式符的個數(shù)要與變量喜喂、常量或者表達式的個數(shù)一一對應瓤摧。
7、自動類型轉(zhuǎn)換
有這么一個詞叫“貍貓換太子”玉吁,變量的數(shù)據(jù)類型就存在這樣的情況照弥。數(shù)據(jù)類型存在自動轉(zhuǎn)換的情況,比如:
自動轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類型運算時进副,在編譯的時候自動完成这揣。自動轉(zhuǎn)換遵循的規(guī)則就好比小盒子可以放進大盒子里面一樣,下圖表示了類型自動轉(zhuǎn)換的規(guī)則影斑。
char類型數(shù)據(jù)轉(zhuǎn)換為int類型數(shù)據(jù)遵循ASCII碼中的對應值给赞,ASCII碼請查看WIKI。
8矫户、強制類型轉(zhuǎn)換
強制類型轉(zhuǎn)換是通過定義類型轉(zhuǎn)換運算來實現(xiàn)的片迅。其一般形式為:
(數(shù)據(jù)類型) (表達式)
其作用是把表達式的運算結(jié)果強制轉(zhuǎn)換成類型說明符所表示的類型,例如:
輸入結(jié)果:
在使用強制轉(zhuǎn)換時應注意以下問題:
1、數(shù)據(jù)類型和表達式都必須加括號,如把(int)(x/2+y)寫成(int)x/2+y則成了把x轉(zhuǎn)換成int型之后再除2再與y相加了。
2、轉(zhuǎn)換后不會改變原數(shù)據(jù)的類型及變量值框沟,只在本次運算中臨時性轉(zhuǎn)換。
3嘁锯、強制轉(zhuǎn)換后的運算結(jié)果不遵循四舍五入原則
二掂林、C語言的運算
1、運算符
我們上小學的時候都學過各種運算鼓蜒,如:加法運算痹换、乘法運算、混合運算等都弹,而運算就要用到運算符娇豫,如:+、-畅厢、×冯痢、÷等等。
在C語言中同樣有運算符,只是寫法可能有所不同浦楣。先說一下C語言中的運算是什么袖肥?C語言中的運算就是對數(shù)據(jù)進行操作、處理的過程振劳。那么運算符又干什么的呢椎组?運算符就是指定該運算的處理方式。
那么C語言中又有哪些運算符呢历恐?
如下所示:
※ 算術(shù)運算符
※ 賦值運算符
※ 關(guān)系運算符
※ 邏輯運算符
※ 三目運算符
2寸癌、算術(shù)運算符
C語言基本算術(shù)運算符如下表:
除法運算中注意:
如果相除的兩個數(shù)都是整數(shù)的話,則結(jié)果也為整數(shù)弱贼,小數(shù)部分省略蒸苇,如8/3 = 2;而兩數(shù)中有一個為小數(shù)吮旅,結(jié)果則為小數(shù)填渠,如:9.0/2 = 4.500000。
取余運算中注意:
該運算只適合用兩個整數(shù)進行取余運算鸟辅,如:10%3 = 1氛什;而10.0%3則是錯誤的;運算后的符號取決于被模數(shù)的符號匪凉,如(-10)%3 = -1;而10%(-3) = 1枪眉。
注:C語言中沒有乘方這個運算符,也不能用×再层,÷等算術(shù)符號贸铜。
另:關(guān)于自增自減運算符,會在下一小節(jié)講解聂受。
3蒿秦、自增與自減運算符
自增運算符為“++”,其功能是使變量的值自增1蛋济;自減運算符為“--”棍鳖,其功能是使變量值自減1。它們經(jīng)常使用在循環(huán)中碗旅。自增自減運算符有以下幾種形式:
注意:無論是a++還是++a都等同于a=a+1,在表達式執(zhí)行完畢后a的值都自增了1,無論是a--還是--a都等同于a=a-1,在表達式執(zhí)行完畢后a的值都自減少1渡处。
請分析如下代碼輸出結(jié)果:
小伙伴們,別急著看運行結(jié)果祟辟,自己先想想看結(jié)果是什么医瘫?
運行結(jié)果:
4、賦值運算符
在前面的小節(jié)中接觸過簡單的賦值運算符“=”旧困,如:
那么C語言中的賦值運算符又是什么呢醇份?
C語言中賦值運算符分為
簡單賦值運算符和復合賦值運算符稼锅,之前我們已經(jīng)接觸過簡單賦值運算符“=”號了,下面講一下復合賦值運算符:
復合賦值運算符就是在簡單賦值符“=”之前加上其它運算符構(gòu)成僚纷,例如+=矩距、-=、*=畔濒、/=剩晴、%=。
看一個小例子:
分析:定義整型變量a并賦值為3侵状,a += 5;這個算式就等價于a = a+5;
將變量a和5相加之后再賦值給a
5赞弥、關(guān)系運算符
本節(jié)的所講解的符號,大家在生活中應該都有用過趣兄,像我們?nèi)ド虉鲑I東西绽左,都會比較一下價格,是不是相等啊艇潭,哪家的貴拼窥,哪家的便宜啊。
在C語言中程序中也存在這樣的比較蹋凝,這個時候就需要用到關(guān)系運算符了鲁纠。
下面是C語言中的關(guān)系運算符:
關(guān)系表達式的值是“真”和“假”,在C程序用整數(shù)1和0表示鳍寂。如:
其結(jié)果為:
注意:>=改含,<=,==迄汛,!=這種符號之間不能存在空格捍壤。
6、邏輯運算符
在數(shù)學中我們見過7<x<100這樣的公式鞍爱,意思是x大于7并且x小于100鹃觉。
在程序中這樣寫一個變量的范圍值是不行的,計算機是看不懂這樣的算式的睹逃,那么怎樣讓計算機看懂呢盗扇?這里就要用到邏輯運算符了。
下面我們看一下C語言中的邏輯運算符:
那么前面的那個算式寫成計算機可以看的懂的算式就是:x>7 && x<100;
邏輯運算的值也是有兩種分別為“真”和“假”唯卖,C語言中用整型的1和0來表示粱玲。其求值規(guī)則如下:
- 與運算(&&)
參與運算的兩個變量都為真時,結(jié)果才為真拜轨,否則為假。例如:5>=5 && 7>5 允青,運算結(jié)果為真橄碾;
- 或運算(||)
參與運算的兩個變量只要有一個為真卵沉,結(jié)果就為真。 兩個量都為假時法牲,結(jié)果為假史汗。例如:5>=5||5>8,運算結(jié)果為真拒垃;
- 非運算(!)
參與運算的變量為真時停撞,結(jié)果為假;參與運算量為假時悼瓮,結(jié)果為真戈毒。例如:!(5>8),運算結(jié)果為真横堡。
7埋市、三目運算符
我們購物的時候經(jīng)常會說如果這個物品大于多少錢就不買了,條件就是大于多少錢命贴,結(jié)果就是不買了道宅。
那么上面所說的能不能在C語言中表示出來呢?當然是可以了胸蛛,不過C語言中污茵,需要用到一個符號,這個符號就是三目運算符葬项。
C語言中的三目運算符:“?:”泞当,其格式為:
表達式1 ? 表達式2 : 表達式3;
執(zhí)行過程是:
先判斷表達式1的值是否為真,如果是真的話執(zhí)行表達式2玷室;如果是假的話執(zhí)行表達式3零蓉。
用代碼來寫一下上面的例子:
8、運算符大比拼之優(yōu)先級比較
問:優(yōu)先級是神馬穷缤?
答:優(yōu)先級就是在運算中運算的先后順序敌蜂。
那么我們來看看我們學習的各種運算符號的順序吧!
優(yōu)先級別為1的優(yōu)先級最高津肛,優(yōu)先級別為10的優(yōu)先級別最低章喉。
大家沒必要去死記運算符的優(yōu)先級順序,記住最高優(yōu)先級別的身坐,在開發(fā)中就會無敵啦~來看一看下面的例子:
解析:C語言中運算符中最高等級的為()秸脱,因此執(zhí)行過程為:
1、先計算a>3和a+3的結(jié)果部蛇,計算后算式為1*a-14%3摊唇;
2、再計算1*a和14%3的結(jié)果涯鲁,計算后算式為11-2巷查;
3有序、最后算出結(jié)果為9。
三岛请、語句
1旭寿、分支結(jié)構(gòu)之簡單if語句
還曾記得小時候,每當快考試的時候崇败,家長總會說如果你能考得100分的話盅称,就會給買個玩具。不難看出這是個判斷句后室,那么在C語言中缩膝,這種判斷語句該如何表達呢?這就要用到C語言中的分支結(jié)構(gòu)語句中的if條件語句咧擂。
簡單if語句的基本結(jié)構(gòu)如下:
其語義是:如果表達式的值為真逞盆,則執(zhí)行其后的語句,否則不執(zhí)行該語句松申。 其過程可表示為下圖
那么考試成績?nèi)绻麨?00分云芦,給買玩具。用代碼就可以表示為:
注意:if()后面沒有分號贸桶,直接寫{}
2舅逸、分支結(jié)構(gòu)之簡單if-else語句
考試之前,家長會說如果考100分就買玩具皇筛。那么我們會問那考不了100分呢琉历,家長這時會說考不了也沒關(guān)系下次再接再厲,只是沒有獎勵了水醋。
那么像上面這種情況旗笔,在C語言中就要用到if-else語句了,簡單的if-else語句的基本結(jié)構(gòu)如下:
其語義是:如果表達式的值為真拄踪,則執(zhí)行代碼塊1蝇恶,否則執(zhí)行代碼塊2。其執(zhí)行過程可表示為下圖:
那么考試成績?nèi)绻麨?00分惶桐,給買玩具撮弧,否則沒有獎勵。用代碼可以表示為:
注意:if()后面沒有分號姚糊,直接寫{}贿衍,else后面也沒有分號,直接寫{}
3救恨、分支結(jié)構(gòu)之多重if-else語句
考試之前贸辈,家長說了,你如果考90分以上的話買玩具肠槽,如果考70到90之間請吃大餐裙椭,否則沒有獎勵躏哩。
那么針對這種多重的條件的話署浩,在C語言中就要用到多重if-else語句揉燃,其結(jié)構(gòu)如下:
其語義是:依次判斷表達式的值,當出現(xiàn)某個值為真時筋栋,則執(zhí)行對應代碼塊炊汤,否則執(zhí)行代碼塊n。 if-else-if語句的執(zhí)行過程如下圖所示:
那么上面家長所說的弊攘,用代碼實現(xiàn)如下:
注意:當某一條件為真的時候抢腐,則不會向下執(zhí)行該分支結(jié)構(gòu)的其他語句。
4襟交、分支結(jié)構(gòu)之嵌套if-else語句
考試之前迈倍,家長說了,你如果考90分以上的話會買玩具捣域,否則沒有獎勵啼染,如果能在獲得玩具的情況下獲取班級前三名的話會有大餐吃。
那么想滿足這位家長所有說的焕梅,就需要用到C語言中嵌套if-else語句迹鹅。嵌套if-else語句的意思,就是在if-else語句中贞言,再寫if-else語句斜棚。其一般形式為:
其執(zhí)行過程為:
上面家長所說的用代碼實習如下
運行結(jié)果:
吃大餐,買玩具
5该窗、循環(huán)結(jié)構(gòu)之while循環(huán)
小明在英語測驗的時候弟蚀,"computer"這個單詞寫錯了,小明為了記住該單詞酗失,下狠心要抄寫10遍义钉,然后小明苦兮兮的抄寫了10遍。這里我們就可以說小明在循環(huán)抄寫级零。
那我們將這種反復不停的執(zhí)行某個動作稱之謂循環(huán)
断医,C語言中有三種循環(huán)結(jié)構(gòu),先看一下C語言while循環(huán)的結(jié)構(gòu)
其中表達式表示循環(huán)條件奏纪,執(zhí)行代碼塊為循環(huán)體鉴嗤。while語句的語義是:計算表達式的值,當值為真(非0)時序调, 執(zhí)行循環(huán)體代碼塊醉锅。其執(zhí)行過程可用下圖表示:
小明現(xiàn)在想偷懶了,不想手抄了发绢,他用代碼實現(xiàn)如下:
使用while語句應注意以下幾點:
1硬耍、while語句中的表達式一般是關(guān)系表達或邏輯表達式垄琐,當表達式的值為假時不執(zhí)行循環(huán)體,反之則循環(huán)體一直執(zhí)行经柴。
2狸窘、一定要記著在循環(huán)體中改變循環(huán)變量的值,否則會出現(xiàn)死循環(huán)(無休止的執(zhí)行)坯认。
3翻擒、循環(huán)體如果包括有一個以上的語句,則必須用{}括起來牛哺,組成復合語句陋气。
6、循環(huán)結(jié)構(gòu)之do-while循環(huán)
小明英語測驗引润,“computer”這個單詞再一次寫錯了巩趁,小明又決定抄10遍,但是小明想“我寫一遍就能記住了淳附,剩下的交給計算機幫我完成议慰!”。
對于小明這個想法燃观,就可以用到C語言中的do-while循環(huán)褒脯,一般形式如下:
do-while循環(huán)語句的語義是:它先執(zhí)行循環(huán)中的執(zhí)行代碼塊,然后再判斷while中表達式是否為真缆毁,如果為真則繼續(xù)循環(huán)番川;如果為假,則終止循環(huán)脊框。因此颁督,do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。其執(zhí)行過程可用下圖表示:
根據(jù)do-while語句的特點浇雹,小明的代碼實現(xiàn)如下:
注意:使用do-while結(jié)構(gòu)語句時沉御,while括號后必須有分號。
7昭灵、循環(huán)結(jié)構(gòu)之for循環(huán)(一)
在C語言中還有一種更加靈活的循環(huán)剃氧,它完全可以秒殺前面兩種循環(huán)結(jié)構(gòu)滔吠,因為它相對前兩種循環(huán)結(jié)構(gòu)語法更直接忠聚、簡單茄菊。它的一般形式為:
它的執(zhí)行過程如下:
第一步:執(zhí)行表達式1,對循環(huán)變量做初始化抠蚣;
第二步:判斷表達式2祝旷,若其值為真(非0),則執(zhí)行for循環(huán)體中執(zhí)行代碼塊,然后向下執(zhí)行怀跛;若其值為假(0)距贷,則結(jié)束循環(huán);
第三步:執(zhí)行表達式3吻谋;
第四步:執(zhí)行for循環(huán)中執(zhí)行代碼塊后執(zhí)行第二步忠蝗;
第五步:循環(huán)結(jié)束,程序繼續(xù)向下執(zhí)行滨溉。
其執(zhí)行過程可用下圖表示:
例:小明下決心抄10遍computer這個單詞什湘,用for循環(huán)實現(xiàn)如下:
注意:for循環(huán)中的分號一定要寫
8、循環(huán)結(jié)構(gòu)之for循環(huán)(二)
在for循環(huán)中晦攒,表達式1是一個或多個賦值語句,它用來控制變量的初始值得哆;表達式2是一個關(guān)系表達式脯颜,它決定什么時候退出循環(huán);表達式3是循環(huán)變量的步進值贩据,定義控制循環(huán)變量每循環(huán)一次后按什么方式變化栋操。這三部分之間用分號(;)分開。
使用for語句應該注意:
1饱亮、for循環(huán)中的“表達式1矾芙、2、3”均可可以缺省近上,但分號(;)不能缺省剔宪。
2、省略“表達式1(循環(huán)變量賦初值)”壹无,表示不對循環(huán)變量賦初始值葱绒。如:
3、省略“表達式2(循環(huán)條件)”斗锭,不做其它處理地淀,循環(huán)一直執(zhí)行(死循環(huán))。如:
4岖是、省略“表達式3(循環(huán)變量增量)”帮毁,不做其他處理,循環(huán)一直執(zhí)行(死循環(huán))豺撑。如:
注:死循環(huán)可以使用后面即將講到的break解決
5烈疚、表達式1可以是設(shè)置循環(huán)變量的初值的賦值表達式,也可以是其他表達式前硫。如:
6胞得、表達式1和表達式3可以是一個簡單表達式也可以是多個表達式以逗號分割。如:
7、表達式2一般是關(guān)系表達式或邏輯表達式阶剑,但也可是數(shù)值表達式或字符表達式跃巡,只要其值非零,就執(zhí)行循環(huán)體牧愁。
8素邪、各表達式中的變量一定要在for循環(huán)之前定義。如:
8猪半、循環(huán)結(jié)構(gòu)之三種循環(huán)比較
while兔朦、do-while和for三種循環(huán)在具體的使用場合上是有區(qū)別的,如下:
1磨确、在知道循環(huán)次數(shù)的情況下更適合使用for循環(huán)沽甥;
2、在不知道循環(huán)次數(shù)的情況下適合使用while或者do-while循環(huán)乏奥,如果有可能一次都不循環(huán)應考慮使用while循環(huán)摆舟,如果至少循環(huán)一次應考慮使用do-while循環(huán)。
但是從本質(zhì)上講邓了,while,do-while和for循環(huán)之間是可以相互轉(zhuǎn)換的恨诱,如:小明被老師罰抄10次computer這個單詞,分別用三種語法寫:
三種循環(huán)結(jié)構(gòu)輸出的結(jié)果是完全一樣的骗炉。你更喜歡哪種循環(huán)結(jié)構(gòu)呢照宝?
9、循環(huán)結(jié)構(gòu)之多重循環(huán)
在功能需求上句葵,往往一個循環(huán)滿足不了厕鹃,比如:循環(huán)用一個“*”輸出,得到一下圖形
上面這個例子顯然我們用一個循環(huán)不是太容易實現(xiàn)笼呆,這個時候我們就要用到多重循環(huán)熊响,多重循環(huán)就是在循環(huán)結(jié)構(gòu)的循環(huán)體中又出現(xiàn)循環(huán)結(jié)構(gòu)。
在實際開發(fā)中一般最多用到三層重循環(huán)诗赌。因為循環(huán)層數(shù)越多汗茄,運行時間越長,程序越復雜铭若,所以一般用2-3層多重循環(huán)就可以了洪碳。另外不同循環(huán)之間也是可以嵌套的。
多重循環(huán)在執(zhí)行的過程中叼屠,外層循環(huán)為父循環(huán)瞳腌,內(nèi)層循環(huán)為子循環(huán),父循環(huán)一次镜雨,子循環(huán)需要全部執(zhí)行完嫂侍,直到跳出循環(huán)。父循環(huán)再進入下一次,子循環(huán)繼續(xù)執(zhí)行...
注:一個父循環(huán)可以有多個子循環(huán)
那么上面這個用“*”輸出的矩形用多重循環(huán)實現(xiàn)如下:
9挑宠、結(jié)束語句之break語句
在我們生活中菲盾,可能會由于某種原因需要中斷當前的事情,并且不能繼續(xù)進行下去各淀。如:小明今天籃球訓練懒鉴,需要運球10次,當運到5次的時候碎浇,突然肚子疼無法堅持循環(huán)临谱,這個時候就要停止訓練。
我們可以將運球看成是一個循環(huán)奴璃,那么循環(huán)5次的時候悉默,需要中斷不繼續(xù)訓練。在C語言中溺健,可以使用break語句進行該操作麦牺,代碼實現(xiàn)如下:
運行結(jié)果:
使用break語句時注意以下幾點:
1、在沒有循環(huán)結(jié)構(gòu)的情況下鞭缭,break不能用在單獨的if-else語句中。
2魏颓、在多層循環(huán)中岭辣,一個break語句只跳出當前循環(huán)。
10甸饱、結(jié)束語句之continue語句
在我們生活中沦童,可能會由于某中原因需要中斷當前的事情,過一會還能繼續(xù)進行叹话。如:小明今天籃球訓練偷遗,需要運球10次,當運到5次的時候驼壶,突然來電話了氏豌,然后接完電話回來繼續(xù)訓練。
我們可以將運球看成是一個循環(huán)热凹,那么循環(huán)5次的時候泵喘,需要中斷后繼續(xù)訓練。在C語言中般妙,可以使用continue語句進行該操作纪铺,代碼實現(xiàn)如下:
運行結(jié)果:
continue語句的作用是結(jié)束本次循環(huán)開始執(zhí)行下一次循環(huán)。
**break語句與continue語句的區(qū)別是:break是跳出當前整個循環(huán)碟渺,continue結(jié)束本次循環(huán)開始下一次循環(huán)鲜锚。 **
11、分支結(jié)構(gòu)之switch語句
C語言還提供了一種用于多分支選擇的switch語句,它的用處也不少芜繁,例如:小明對自己每周的學習和生活制定了計劃方案旺隙,每天應該做什么都詳細規(guī)劃。
switch語句結(jié)構(gòu)如下
其執(zhí)行順序如下圖:
例子代碼實現(xiàn):
在使用switch語句時還應注意以下幾點:
1浆洗、在case后的各常量表達式的值不能相同催束,否則會出現(xiàn)錯誤。
2伏社、在case子句后如果沒有break;會一直往后執(zhí)行一直到遇到break;才會跳出switch語句抠刺。
運行結(jié)果:
學英語學C語言好好休息
3、switch后面的表達式語句只能是整型或者字符類型摘昌。
4速妖、在case后,允許有多個語句聪黎,可以不用{}括起來罕容。
5、各case和default子句的先后順序可以變動稿饰,而不會影響程序執(zhí)行結(jié)果锦秒。
6、default子句可以省略不用喉镰。
12旅择、臭名遠揚之goto語句
大家平時出門的時候都會有個目的地,我今天要去哪哪哪侣姆,然后就去了生真。
那么C語言中也有這樣的語句,就是goto語句捺宗,goto語句是一種無條件分支語句柱蟀,goto 語句的使用格式為:
goto 語句標號;
其中語句標號是一個標識符,該標識符一般用英文大寫并遵守標識符命名規(guī)則蚜厉,這個標識符加上一個“:”一起出現(xiàn)在函數(shù)內(nèi)某處长已,執(zhí)行g(shù)oto語句后,程序?qū)⑻D(zhuǎn)到該標號處并執(zhí)行其后的語句弯囊。
goto語句通常不用痰哨,主要因為它將使程序?qū)哟尾磺澹也灰鬃x匾嘱,但在特定情況下斤斧,可以使用goto語句來提高程序的執(zhí)行速度,所以還是少用為妙霎烙。
例如:用goto語句和if語句構(gòu)成循環(huán)求10以內(nèi)的數(shù)之和撬讽。
運行結(jié)果為:
sum=55
四蕊连、函數(shù)
1、自創(chuàng)函數(shù)
C語言提供了大量的庫函數(shù)(右側(cè)資料下載中有)游昼,比如stdio.h提供輸出函數(shù)甘苍,但是還是滿足不了我們開發(fā)中的一些邏輯,所以這個時候需要自己定義函數(shù)烘豌,自定義函數(shù)的一般形式:
注意:
1载庭、[]包含的內(nèi)容可以省略,數(shù)據(jù)類型說明省略廊佩,默認是int類型函數(shù)囚聚;參數(shù)省略表示該函數(shù)是無參函數(shù),參數(shù)不省略表示該函數(shù)是有參函數(shù)标锄;
2顽铸、函數(shù)名稱遵循標識符命名規(guī)范;
3料皇、自定義函數(shù)盡量放在main函數(shù)之前谓松,如果要放在main函數(shù)后面的話,需要在main函數(shù)之前先聲明自定義函數(shù)践剂,聲明格式為:[數(shù)據(jù)類型說明] 函數(shù)名稱([參數(shù)]);
那現(xiàn)在我們就自定義一個sayHello()函數(shù):
2鬼譬、函數(shù)調(diào)用
自定義的函數(shù)不是放在程序中擺著看的,我們需要用到自定義的函數(shù)的時候逊脯,就得調(diào)用它拧簸,那么在調(diào)用的時候就稱之為函數(shù)調(diào)用。
在C語言中男窟,函數(shù)調(diào)用的一般形式為:
函數(shù)名([參數(shù)]);
注意:
1、對無參函數(shù)調(diào)用的時候可以將[]包含的省略贾富。
2歉眷、[]中可以是常數(shù),變量或其它構(gòu)造類型數(shù)據(jù)及表達式颤枪,個參數(shù)之間用逗號分隔汗捡。
比如上一小節(jié)中的例子可以修改為:
運行結(jié)果為:
慕課網(wǎng)的小伙伴們,大家好
3畏纲、有參與無參
在函數(shù)中不需要函數(shù)參數(shù)的稱之為無參函數(shù)扇住,在函數(shù)中需要函數(shù)參數(shù)的稱之為有參函數(shù),有參和無參函數(shù)的一般形式如下:
有參函數(shù)和無參函數(shù)的唯一區(qū)別在于:函數(shù)()中多了一個參數(shù)列表盗胀。
下面看一個例子對比有參和無參函數(shù):
對應輸出結(jié)果:
在該例子中艘蹋,我們不難發(fā)現(xiàn)有參函數(shù)更為靈活,輸出的圖形可以隨著n的改變而隨意變動票灰,只要在main函數(shù)中傳遞一個參數(shù)就可以了女阀;而在無參函數(shù)中輸出的相對就比較固定宅荤,當需要改動的時候還需要到自定義的方法內(nèi)改變循環(huán)變量的值。
4浸策、形參與實參
小明和小剛都說冯键,要早起去鍛煉,但是呢庸汗,小明每天都在睡懶覺惫确,他只是形式上說說而已;而小剛則每天都在堅持蚯舱,他是在實際行動改化。C語言函數(shù)中的參數(shù)也和情景中的類似有兩種。
函數(shù)的參數(shù)分為形參和實參兩種,形參是在定義函數(shù)名和函數(shù)體的時候使用的參數(shù),目的是用來接收調(diào)用該函數(shù)時傳入的參數(shù)晓淀,就類似小明所袁,說了的話而不實際行動;實參是在調(diào)用時傳遞該函數(shù)的參數(shù)凶掰,就如小剛能實際行動起來燥爷。
函數(shù)的形參和實參具有以下特點:
- 形參只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時懦窘,即刻釋放所分配的內(nèi)存單元前翎。因此,形參只有在函數(shù)內(nèi)部有效畅涂。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量港华。
- 實參可以是常量、變量午衰、表達式立宜、函數(shù)等,無論實參是何種類型的量臊岸,在進行函數(shù)調(diào)用時橙数,它們都必須具有確定的值,以便把這些值傳送給形參帅戒。因此應預先用賦值等辦法使實參獲得確定值灯帮。
- 在參數(shù)傳遞時,實參和形參在數(shù)量上逻住,類型上钟哥,順序上應嚴格一致,否則會發(fā)生類型不匹配”的錯誤瞎访。
例如:以下函數(shù)multiDouble(int x)實現(xiàn)把x乘以2再返回給函數(shù)調(diào)用處腻贰。
5、函數(shù)的返回值
小明碰到一道數(shù)學選擇題問小剛装诡,小剛算了一會給小明說計算結(jié)果是100银受,應選A践盼。那么小剛給小明的反饋就可以說是小剛的一個返回值。
那么函數(shù)的返回值是指函數(shù)被調(diào)用之后宾巍,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值咕幻。
函數(shù)的返回值要注意以下幾點:
1. 函數(shù)的值只能通過return語句返回主調(diào)函數(shù)。return語句的一般形式為:
**return 表達式** 或者為: **return (表達式);**
2. 函數(shù)值的類型和函數(shù)定義中函數(shù)的類型應保持一致顶霞。如果兩者不一致肄程,則以函數(shù)返回類型為準,自動進行類型轉(zhuǎn)換选浑。
就如小剛說選A蓝厌,那么就返回一個字符型數(shù)據(jù),用代碼表示就是:
小剛說值為100古徒,那么就返回一個整型數(shù)據(jù)拓提,用代碼表示就是:
3. 沒有返回值的函數(shù),返回類型為void隧膘。如果小剛算了一會沒有返回結(jié)果的話代态,那么用代碼表示就是:
注意:void函數(shù)中可以有執(zhí)行代碼塊,但是不能有返回值疹吃,另void函數(shù)中如果有return語句蹦疑,該語句只能起到結(jié)束函數(shù)運行的功能。其格式為:return;
6萨驶、遞歸函數(shù)(一)
從前有座山啊歉摧,山里有座廟啊,廟里有個老和尚和一個小和尚腔呜,他們在干什么呢叁温?老和尚在給小和尚講故事,講的什么呢核畴?講的是從前有座山...看到這券盅,大家都會問老師你不講課,你說這個老掉牙的故事干嗎膛檀?
在這說這個故事是有意義的,大家在仔細讀讀這個故事娘侍,是不是老和尚在說一件事咖刃,當碰到一個條件的時候都會再重復的從頭說起呢?
那么這就要給大家引入一個新的概念——遞歸憾筏,遞歸就是一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身嚎杨。執(zhí)行遞歸函數(shù)將反復調(diào)用其自身,每調(diào)用一次就進入新的一層氧腰。
例如:計算n的階乘可以使用以下代碼:
運行結(jié)果為:
5的階乘=120
7枫浙、## 遞歸函數(shù)(二)
我們對上一小節(jié)中求5的階乘這個例子進行一下剖析刨肃,看一看他的運算過程:
程序在計算5的階乘的時候,先執(zhí)行遞推箩帚,當n=1或者n=0的時候返回1粱挡,再回推將計算并返回知纷。由此可以看出
遞歸函數(shù)必須有結(jié)束條件
。
遞歸函數(shù)特點:
- 每一級函數(shù)調(diào)用時都有自己的變量,但是函數(shù)代碼并不會得到復制魏蔗,如計算5的階乘時每遞推一次變量都不同;
- 每次調(diào)用都會有一次返回苏潜,如計算5的階乘時每遞推一次都返回進行下一次步责;
- 遞歸函數(shù)中,位于遞歸調(diào)用前的語句和各級被調(diào)用函數(shù)具有相同的執(zhí)行順序鹅搪;
- 遞歸函數(shù)中站绪,位于遞歸調(diào)用后的語句的執(zhí)行順序和各個被調(diào)用函數(shù)的順序相反;
- 遞歸函數(shù)中必須有終止語句丽柿。
一句話總結(jié)遞歸:自我調(diào)用且有完成狀態(tài)恢准。
8、局部與全局
C語言中的變量航厚,按作用域范圍可分為兩種顷歌,即局部變量和全局變量。
局部變量也稱為內(nèi)部變量幔睬。局部變量是在函數(shù)內(nèi)作定義說明的眯漩。其作用域僅限于函數(shù)內(nèi), 離開該函數(shù)后再使用這種變量是非法的麻顶。在復合語句中也可定義變量赦抖,其作用域只在復合語句范圍內(nèi)。
全局變量也稱為外部變量辅肾,它是在函數(shù)外部定義的變量队萤。它不屬于哪一個函數(shù),它屬于一個源程序文件矫钓。其作用域是整個源程序要尔。
9、變量存儲類別
C語言根據(jù)變量的生存周期來劃分新娜,可以分為靜態(tài)存儲方式和動態(tài)存儲方式赵辕。
靜態(tài)存儲方式:是指在程序運行期間分配固定的存儲空間的方式。靜態(tài)存儲區(qū)中存放了在整個程序執(zhí)行過程中都存在的變量概龄,如全局變量还惠。
動態(tài)存儲方式:是指在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式。動態(tài)存儲區(qū)中存放的變量是根據(jù)程序運行的需要而建立和釋放的私杜,通常包括:函數(shù)形式參數(shù)蚕键;自動變量救欧;函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等。
C語言中存儲類別又分為四類:自動(auto)锣光、靜態(tài)(static)笆怠、寄存器的(register)和外部的(extern)。
1嫉晶、用關(guān)鍵字auto定義的變量為自動變量骑疆,auto可以省略,auto不寫則隱含定為“自動存儲類別”替废,屬于動態(tài)存儲方式箍铭。如:
2、用static修飾的為靜態(tài)變量椎镣,如果定義在函數(shù)內(nèi)部的诈火,稱之為靜態(tài)局部變量;如果定義在函數(shù)外部状答,稱之為靜態(tài)外部變量冷守。如下為靜態(tài)局部變量:
注意:靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元惊科,在程序整個運行期間都不釋放拍摇;靜態(tài)局部變量在編譯時賦初值,即只賦初值一次馆截;如果在定義局部變量時不賦初值的話充活,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)蜡娶。
3混卵、為了提高效率,C語言允許將局部變量得值放在CPU中的寄存器中窖张,這種變量叫“寄存器變量”幕随,用關(guān)鍵字register作聲明。例如:
注意:只有局部自動變量和形式參數(shù)可以作為寄存器變量宿接;一個計算機系統(tǒng)中的寄存器數(shù)目有限赘淮,不能定義任意多個寄存器變量;
局部靜態(tài)變量不能定義為寄存器變量睦霎。
4拥知、用extern聲明的的變量是外部變量,外部變量的意義是某函數(shù)可以調(diào)用在該函數(shù)之后定義的變量碎赢。如:
10、內(nèi)部函數(shù)與外部函數(shù)
人本身是有自己的特定方法的速梗,比如當你說話的時候肮塞,不希望是別人讓你怎么說你就怎么說吧襟齿,那么這種不能被外人調(diào)用的方法稱為人的內(nèi)部方法。人本身還有一些可以調(diào)配的方法枕赵,比如當你家人跟你說猜欺,家里沒有鹽了,你去買袋鹽拷窜,去買鹽就是他人調(diào)用你的方法开皿,那么能被外人調(diào)用的方法稱謂外部方法。
在C語言中不能被其他源文件調(diào)用的函數(shù)稱謂內(nèi)部函數(shù) 篮昧,內(nèi)部函數(shù)由static關(guān)鍵字來定義赋荆,因此又被稱謂靜態(tài)函數(shù),形式為:
static [數(shù)據(jù)類型] 函數(shù)名([參數(shù)])
這里的static是對函數(shù)的作用范圍的一個限定懊昨,限定該函數(shù)只能在其所處的源文件中使用窄潭,因此在不同文件中出現(xiàn)相同的函數(shù)名稱的內(nèi)部函數(shù)是沒有問題的。
在C語言中能被其他源文件調(diào)用的函數(shù)稱謂外部函數(shù) 酵颁,外部函數(shù)由extern關(guān)鍵字來定義嫉你,形式為:
extern [數(shù)據(jù)類型] 函數(shù)名([參數(shù)])
C語言規(guī)定,在沒有指定函數(shù)的作用范圍時躏惋,系統(tǒng)會默認認為是外部函數(shù)幽污,因此當需要定義外部函數(shù)時extern也可以省略。
五簿姨、數(shù)組
我們來看一下如何聲明一個數(shù)組:
數(shù)據(jù)類型 數(shù)組名稱[長度];
數(shù)組只聲明也不行啊距误,看一下數(shù)組是如何初始化的。說到初始化款熬,C語言中的數(shù)組初始化是有三種形式的深寥,分別是:
1、 數(shù)據(jù)類型 數(shù)組名稱[長度n] = {元素1,元素2…元素n};
2贤牛、 數(shù)據(jù)類型 數(shù)組名稱[] = {元素1,元素2…元素n};
3惋鹅、 數(shù)據(jù)類型 數(shù)組名稱[長度n]; 數(shù)組名稱[0] = 元素1; 數(shù)組名稱[1] = 元素2; 數(shù)組名稱[n-1] = 元素n;
我們將數(shù)據(jù)放到數(shù)組中之后又如何獲取數(shù)組中的元素呢?
獲取數(shù)組元素時: 數(shù)組名稱[元素所對應下標];
如:初始化一個數(shù)組 int arr[3] = {1,2,3};
那么arr[0]就是元素1殉簸。
注意:
1闰集、數(shù)組的下標均以0開始;
2般卑、數(shù)組在初始化的時候武鲁,數(shù)組內(nèi)元素的個數(shù)不能大于聲明的數(shù)組長度;
3蝠检、如果采用第一種初始化方式沐鼠,元素個數(shù)小于數(shù)組的長度時,多余的數(shù)組元素初始化為0;
4饲梭、在聲明數(shù)組后沒有進行初始化的時候乘盖,靜態(tài)(static)和外部(extern)類型的數(shù)組元素初始化元素為0,自動(auto)類型的數(shù)組的元素初始化值不確定憔涉。
1订框、數(shù)組的遍歷
當我們?nèi)コ谢貋碣I了一堆東西,就想要是有個機器人能幫我把東西拿出來放好兜叨,就完美了穿扳。
那么在程序中,數(shù)組就可以采用循環(huán)的方式將每個元素遍歷出來国旷,而不用人為的每次獲取指定某個位置上的元素矛物,例如我們用for循環(huán)遍歷一個數(shù)組:
數(shù)組遍歷時要注意以下幾點:
1、最好避免出現(xiàn)數(shù)組越界訪問议街,循環(huán)變量最好不要超出數(shù)組的長度泽谨,比如:
2、C語言的數(shù)組長度一經(jīng)聲明特漩,長度就是固定吧雹,無法改變,并且C語言并不提供計算數(shù)組長度的方法涂身。
由于C語言是沒有檢查數(shù)組長度改變或者數(shù)組越界的這個機制雄卷,可能會在編輯器中編譯并通過,但是結(jié)果就不能肯定了蛤售,因此還是不要越界或者改變數(shù)組的長度
2丁鹉、數(shù)組作為函數(shù)參數(shù)
前面我們學過,變量可以當作參數(shù)是吧悴能!這里數(shù)組也是可以當做函數(shù)的參數(shù)滴揣钦,啊漠酿?什么冯凹?你問數(shù)組咋當參數(shù)?請看下面知識炒嘲。
數(shù)組可以由整個數(shù)組當作函數(shù)的參數(shù)宇姚,也可以由數(shù)組中的某個元素當作函數(shù)的參數(shù):
1、整個數(shù)組當作函數(shù)參數(shù)夫凸,即把數(shù)組名稱傳入函數(shù)中浑劳,例如:
2、數(shù)組中的元素當作函數(shù)參數(shù)夭拌,即把數(shù)組中的參數(shù)傳入函數(shù)中魔熏,例如:
數(shù)組作為函數(shù)參數(shù)時注意以下事項:
1衷咽、數(shù)組名作為函數(shù)實參傳遞時,函數(shù)定義處作為接收參數(shù)的數(shù)組類型形參既可以指定長度也可以不指定長度蒜绽。
2兵罢、數(shù)組元素作為函數(shù)實參傳遞時,數(shù)組元素類型必須與形參數(shù)據(jù)類型一致滓窍。
3、字符串與數(shù)組
字符串是神馬巩那?字符串就是由多個字符組合而成的一段話吏夯。
在C語言中,是沒有辦法直接定義字符串數(shù)據(jù)類型的即横,但是我們可以使用數(shù)組來定義我們所要的字符串噪生。一般有以下兩種格式:
1、
char 字符串名稱[長度] = "字符串值";
2东囚、
char 字符串名稱[長度] = {'字符1','字符2',...,'字符n','\0'};
注意:
1跺嗽、[]中的長度是可以省略不寫的;
2页藻、采用第2種方式的時候最后一個元素必須是'\0'桨嫁,'\0'表示字符串的結(jié)束標志;
3份帐、采用第2種方式的時候在數(shù)組中不能寫中文璃吧。
在輸出字符串的時候要使用:
printf(“%s”,字符數(shù)組名字);
或者puts(字符數(shù)組名字);。例如:
運行結(jié)果為
4废境、字符串函數(shù)
常用的字符串函數(shù)如下:
使用字符串函數(shù)注意以下事項:
1畜挨、strlen()獲取字符串的長度,在字符串長度中是不包括‘\0’而且漢字和字母的長度是不一樣的噩凹。比如:
2巴元、strcmp()在比較的時候會把字符串先轉(zhuǎn)換成ASCII碼再進行比較,返回的結(jié)果為0表示s1和s2的ASCII碼相等,返回結(jié)果為1表示s1比s2的ASCII碼大,返回結(jié)果為-1表示s1比s2的ASCII碼小,例如:
3驮宴、strcpy()拷貝之后會覆蓋原來字符串且不能對字符串常量進行拷貝逮刨,比如:
4、strcat在使用時s1與s2指的內(nèi)存空間不能重疊幻赚,且s1要有足夠的空間來容納要復制的字符串禀忆,如:
5、多維數(shù)組
多維數(shù)組就好比去超市買東西落恼,用購物袋把所買商品分類存放箩退,然后將所有的購物袋放到一個大的購物袋中,這樣就形成了一個多維數(shù)組了佳谦。
多維數(shù)組的定義格式是:
數(shù)據(jù)類型 數(shù)組名稱[常量表達式1][常量表達式2]...[常量表達式n];
例如:
這樣定義了一個名稱為num戴涝,數(shù)據(jù)類型為int的二維數(shù)組。其中第一個[3]表示第一維下標的長度,就像購物時分類存放的購物啥刻;第二個[3]表示第二維下標的長度奸鸯,就像每個購物袋中的元素。
我們可以把上面的數(shù)組看作一個3×3的矩陣可帽,如下圖:
多維數(shù)組的初始化與一維數(shù)組的初始化類似也是分兩種:
1娄涩、
數(shù)據(jù)類型 數(shù)組名稱[常量表達式1][常量表達式2]...[常量表達式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
2、
數(shù)據(jù)類型 數(shù)組名稱[常量表達式1][常量表達式2]...[常量表達式n]; 數(shù)組名稱[下標1][下標2]...[下標n] = 值;
多維數(shù)組初始化要注意以下事項:
1映跟、采用第一種始化時數(shù)組聲明必須指定列的維數(shù)蓄拣。因為系統(tǒng)會根據(jù)數(shù)組中元素的總個數(shù)來分配空間,當知道元素總個數(shù)以及列的維數(shù)后努隙,會直接計算出行的維數(shù)球恤;
2、采用第二種初始化時數(shù)組聲明必須同時指定行和列的維數(shù)荸镊。
6咽斧、多維數(shù)組的遍歷
在超市買東西回來后,就算是東西再多躬存,再怎么分類张惹,我們還是要拿出來看一下所買的商品的。
多維數(shù)組也是存在遍歷的优构,和一維數(shù)組遍歷一樣诵叁,也是需要用到循環(huán)。不一樣的就是多維數(shù)組需要采用嵌套循環(huán)钦椭,如:遍歷輸出int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
注意:多維數(shù)組的每一維下標均不能越界