c語(yǔ)言語(yǔ)言組成
時(shí)間:2022-02-18 20:12:02 | 來(lái)源:信息時(shí)代
時(shí)間:2022-02-18 20:12:02 來(lái)源:信息時(shí)代
基本構(gòu)成
C的數(shù)據(jù)類型包括:整型、字符型、實(shí)型或浮點(diǎn)型(單精度和雙精度)、枚舉類型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型、指針類型和空類型。
常量其值不可改變,符號(hào)常量名通常用大寫(xiě)。
變量是以某標(biāo)識(shí)符為名字,其值可以改變的量。標(biāo)識(shí)符是以字母或下劃線開(kāi)頭的一串由字母、數(shù)字或下劃線構(gòu)成的序列,請(qǐng)注意第一個(gè)字符必須為字母或下劃線,否則為不合法的變量名。變量在編譯時(shí)為其分配相應(yīng)存儲(chǔ)單元。
如果一個(gè)變量名后面跟著一個(gè)有數(shù)字的中括號(hào),這個(gè)聲明就是數(shù)組聲明。字符串也是一種數(shù)組。它們以ASCII的NULL作為數(shù)組的結(jié)束。要特別注意的是,方括內(nèi)的索引值是從0算起的。
如果一個(gè)變量聲明時(shí)在前面使用*號(hào),表明這是個(gè)指針型變量。換句話說(shuō),該變量存儲(chǔ)一個(gè)地址,而*(此處特指單目運(yùn)算符*,下同。C語(yǔ)言中另有雙目運(yùn)算符*)則是取內(nèi)容操作符,意思是取這個(gè)內(nèi)存地址里存儲(chǔ)的內(nèi)容。指針是C語(yǔ)言區(qū)別于其他同時(shí)代高級(jí)語(yǔ)言的主要特征之一。
指針不僅可以是變量的地址,還可以是數(shù)組、數(shù)組元素、函數(shù)的地址。通過(guò)指針作為形式參數(shù)可以在函數(shù)的調(diào)用過(guò)程得到一個(gè)以上的返回值,不同于return(z)這樣的僅能得到一個(gè)返回值。
指針是一把雙刃劍,許多操作可以通過(guò)指針自然的表達(dá),但是不正確的或者過(guò)分的使用指針又會(huì)給程序帶來(lái)大量潛在的錯(cuò)誤。
C語(yǔ)言的字符串其實(shí)就是以''字符結(jié)尾的char型數(shù)組,使用字符型并不需要引用庫(kù),但是使用字符串就需要C標(biāo)準(zhǔn)庫(kù)里面的一些用于對(duì)字符串進(jìn)行操作的函數(shù)。它們不同于字符數(shù)組。使用這些函數(shù)需要引用頭文件
。
在C語(yǔ)言中,輸入和輸出是經(jīng)由標(biāo)準(zhǔn)庫(kù)中的一組函數(shù)來(lái)實(shí)現(xiàn)的。在ANSIC中,這些函數(shù)被定義在頭文件;中。
標(biāo)準(zhǔn)輸入/輸出
有三個(gè)標(biāo)準(zhǔn)輸入/輸出是標(biāo)準(zhǔn)I/O庫(kù)預(yù)先定義的:
stdin標(biāo)準(zhǔn)輸入
stdout標(biāo)準(zhǔn)輸出
stderr輸入輸出錯(cuò)誤
C語(yǔ)言的運(yùn)算非常靈活,功能十分豐富,運(yùn)算種類遠(yuǎn)多于其它程序設(shè)計(jì)語(yǔ)言。在表達(dá)式方面較其它程序語(yǔ)言更為簡(jiǎn)潔,如自加、自減、逗號(hào)運(yùn)算和三目運(yùn)算使表達(dá)式更為簡(jiǎn)單,但初學(xué)者往往會(huì)覺(jué)的這種表達(dá)式難讀,關(guān)鍵原因就是對(duì)運(yùn)算符和運(yùn)算順序理解不透不全。當(dāng)多種不同運(yùn)算組成一個(gè)運(yùn)算表達(dá)式,即一個(gè)運(yùn)算式中出現(xiàn)多種運(yùn)算符時(shí),運(yùn)算的優(yōu)先順序和結(jié)合規(guī)則顯得十分重要。在學(xué)習(xí)中,對(duì)此合理進(jìn)行分類,找出它們與數(shù)學(xué)中所學(xué)到運(yùn)算之間的不同點(diǎn)之后,記住這些運(yùn)算也就不困難了,有些運(yùn)算符在理解后更會(huì)牢記心中,將來(lái)用起來(lái)得心應(yīng)手,而有些可暫時(shí)放棄不記,等用到時(shí)再記不遲。
先要明確運(yùn)算符按優(yōu)先級(jí)不同分類,《C程序設(shè)計(jì)》運(yùn)算符可分為15種優(yōu)先級(jí),從高到低,優(yōu)先級(jí)為1~15,除第2.13級(jí)和第14級(jí)為從右至左結(jié)合外,其它都是從左至右結(jié)合,它決定同級(jí)運(yùn)算符的運(yùn)算順序。
關(guān)鍵字
關(guān)鍵字又稱為保留字,就是已被C語(yǔ)言本身使用,不能作其它用途使用的字。例如關(guān)鍵字不能用作變量名、函數(shù)名等標(biāo)識(shí)符
由ISO標(biāo)準(zhǔn)定義的C語(yǔ)言關(guān)鍵字共32個(gè):
autodoubleintstructbreakelselongswitch
caseenumregistertypedefcharexternreturnunion
constfloatshortunsignedcontinueforsignedvoid
defaultgotosizeofvolatiledoifwhilestaticinline
restrict_Bool_Complex_Imaginary_Generic
#define預(yù)編譯宏
#if表達(dá)式#elseif表達(dá)式#else#endif條件編譯
#ifdef宏#else#endif條件編譯
#ifndef宏#else#endif條件編譯與條件編譯
語(yǔ)法結(jié)構(gòu)
順序結(jié)構(gòu)的程序設(shè)計(jì)是最簡(jiǎn)單的,只要按照解決問(wèn)題的順序?qū)懗鱿鄳?yīng)的語(yǔ)句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。
例如:a=3,b=5,現(xiàn)交換a,b的值,這個(gè)問(wèn)題就好像交換兩個(gè)杯子水,這當(dāng)然要用到第三個(gè)杯子,假如第三個(gè)杯子是c,那么正確的程序?yàn)椋篶=a;a=b;b=c;執(zhí)行結(jié)果是a=5,b=c=3如果改變其順序,寫(xiě)成:a=b;c=a;b=c;則執(zhí)行結(jié)果就變成a=b=c=5,不能達(dá)到預(yù)期的目的,初學(xué)者最容易犯這種錯(cuò)誤。順序結(jié)構(gòu)可以獨(dú)立使用構(gòu)成一個(gè)簡(jiǎn)單的完整程序,常見(jiàn)的輸入、計(jì)算,輸出三步曲的程序就是順序結(jié)構(gòu),例如計(jì)算圓的面積,其程序的語(yǔ)句順序就是輸入圓的半徑r,計(jì)算s=3.14159*r*r,輸出圓的面積s。不過(guò)大多數(shù)情況下順序結(jié)構(gòu)都是作為程序的一部分,與其它結(jié)構(gòu)一起構(gòu)成一個(gè)復(fù)雜的程序,例如分支結(jié)構(gòu)中的復(fù)合語(yǔ)句、循環(huán)結(jié)構(gòu)中的循環(huán)體等。
順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問(wèn)題,但不能做判斷再選擇。對(duì)于要先做判斷再選擇的問(wèn)題就要使用選擇結(jié)構(gòu)。選擇結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序。選擇結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)倪x擇語(yǔ)句。選擇結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計(jì)算,設(shè)計(jì)這類程序時(shí)往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫(xiě)出源程序,這樣做把程序設(shè)計(jì)分析與語(yǔ)言分開(kāi),使得問(wèn)題簡(jiǎn)單化,易于理解。程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。
循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書(shū)寫(xiě)的工作量,用來(lái)描述重復(fù)執(zhí)行某段算法的問(wèn)題,這是程序設(shè)計(jì)中最能發(fā)揮計(jì)算機(jī)特長(zhǎng)的程序結(jié)構(gòu),C語(yǔ)言中提供四種循環(huán),即goto循環(huán)、while循環(huán)、dowhile循環(huán)和for循環(huán)。四種循環(huán)可以用來(lái)處理同一問(wèn)題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因?yàn)閺?qiáng)制改變程序的順序經(jīng)常會(huì)給程序的運(yùn)行帶來(lái)不可預(yù)料的錯(cuò)誤。
特別要注意在循環(huán)體內(nèi)應(yīng)包含趨于結(jié)束的語(yǔ)句(即循環(huán)變量值的改變),否則就可能成了一個(gè)死循環(huán),這是初學(xué)者的一個(gè)常見(jiàn)錯(cuò)誤。
三個(gè)循環(huán)的異同點(diǎn):用while和do…while循環(huán)時(shí),循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語(yǔ)句1中進(jìn)行的;while循環(huán)和for循環(huán)都是先判斷表達(dá)式,后執(zhí)行循環(huán)體,而do…while循環(huán)是先執(zhí)行循環(huán)體后判斷表達(dá)式,也就是說(shuō)do…while的循環(huán)體最少被執(zhí)行一次,而while循環(huán)和for就可能一次都不執(zhí)行。另外還要注意的是這三種循環(huán)都可以用break語(yǔ)句跳出循環(huán),用continue語(yǔ)句結(jié)束本次循環(huán),而goto語(yǔ)句與if構(gòu)成的循環(huán),是不能用break和continue語(yǔ)句進(jìn)行控制的。
順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)并不彼此孤立的,在循環(huán)中可以有分支、順序結(jié)構(gòu),分支中也可以有循環(huán)、順序結(jié)構(gòu),其實(shí)不管哪種結(jié)構(gòu),均可廣義的把它們看成一個(gè)語(yǔ)句。在實(shí)際編程過(guò)程中常將這三種結(jié)構(gòu)相互結(jié)合以實(shí)現(xiàn)各種算法,設(shè)計(jì)出相應(yīng)程序,但是要編程的問(wèn)題較大,編寫(xiě)出的程序就往往很長(zhǎng)、結(jié)構(gòu)重復(fù)多,造成可讀性差,難以理解,解決這個(gè)問(wèn)題的方法是將C程序設(shè)計(jì)成模塊化結(jié)構(gòu)。
for循環(huán)結(jié)構(gòu)是c語(yǔ)言中最具有特色的循環(huán)語(yǔ)句,使用最為靈活方便,它的一般形式為:
但是在整個(gè)for循環(huán)過(guò)程中,表達(dá)式1只計(jì)算一次,表達(dá)式2和表達(dá)式3則可能計(jì)算多次,也可能一次也不計(jì)算。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。
先執(zhí)行表達(dá)式2,然后執(zhí)行循環(huán)結(jié)構(gòu),最后表達(dá)式3,一直這樣循環(huán)下去。
for循環(huán)語(yǔ)句是c語(yǔ)言種功能最為強(qiáng)大的語(yǔ)句,甚至在一定程度上可以代替其他的循環(huán)語(yǔ)句。
do循環(huán)結(jié)構(gòu),do1while⑵;的執(zhí)行順序是1->2->1...循環(huán),2為循環(huán)條件。
while循環(huán)結(jié)構(gòu),while(1)2;的執(zhí)行順序是1->2->1...循環(huán),1為循環(huán)條件
以上循環(huán)語(yǔ)句,當(dāng)循環(huán)條件表達(dá)式為真則繼續(xù)循環(huán),為假則跳出循環(huán)。
程序結(jié)構(gòu)
C語(yǔ)言的模塊化程序結(jié)構(gòu)用函數(shù)來(lái)實(shí)現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個(gè)模塊都編寫(xiě)成一個(gè)C函數(shù),然后通過(guò)主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來(lái)實(shí)現(xiàn)一大型問(wèn)題的C程序編寫(xiě),因此常說(shuō):C程序=主函數(shù) 子函數(shù)。因此,對(duì)函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過(guò)上機(jī)調(diào)試加以鞏固。
if語(yǔ)句:'如果'語(yǔ)句;if—else語(yǔ)句:'若…(則)…否則…'語(yǔ)句;switch語(yǔ)句:'切換'語(yǔ)句;switch—case:'切換—情況'語(yǔ)句。
while語(yǔ)句:'當(dāng)…'語(yǔ)句;do—while語(yǔ)句:'做…當(dāng)…(時(shí)候)'語(yǔ)句;for語(yǔ)句:條件語(yǔ)句(即'(做)…為了…'語(yǔ)句)。
goto語(yǔ)句:'轉(zhuǎn)舵'語(yǔ)句,也稱'跳轉(zhuǎn)'語(yǔ)句;break語(yǔ)句:'中斷'(循環(huán))語(yǔ)句,即結(jié)束整個(gè)循環(huán);continue語(yǔ)句:'繼續(xù)'語(yǔ)句(結(jié)束本次循環(huán),繼續(xù)下一次循環(huán));return語(yǔ)句:'返回'語(yǔ)句。
1、一個(gè)C語(yǔ)言源程序可以由一個(gè)或多個(gè)源文件組成。
2、每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成。
3、一個(gè)源程序不論由多少個(gè)文件組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù)。是整個(gè)程序的入口。
4、源程序中可以有預(yù)處理命令(包括include命令,ifdef、ifndef命令、define命令),預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。
5、每一個(gè)說(shuō)明,每一個(gè)語(yǔ)句都必須以分號(hào)結(jié)尾。但預(yù)處理命令,函數(shù)頭和花括號(hào)'}'之后不能加分號(hào)。(結(jié)構(gòu)體、聯(lián)合體、枚舉型的聲明的'}'后要加';'。)
6、標(biāo)識(shí)符,關(guān)鍵字之間必須至少加一個(gè)空格以示間隔。若已有明顯的間隔符,也可不再加空格來(lái)間隔。
1、一個(gè)說(shuō)明或一個(gè)語(yǔ)句占一行。
2、用{}括起來(lái)的部分,通常表示了程序的某一層次結(jié)構(gòu)。{}一般與該結(jié)構(gòu)語(yǔ)句的第一個(gè)字母對(duì)齊,并單獨(dú)占一行。
3、低一層次的語(yǔ)句或說(shuō)明可比高一層次的語(yǔ)句或說(shuō)明縮進(jìn)若干格后書(shū)寫(xiě)。以便看起來(lái)更加清晰,增加程序的可讀性。在編程時(shí)應(yīng)力求遵循這些規(guī)則,以養(yǎng)成良好的編程風(fēng)格。
函數(shù)
C程序是由一組變量或是函數(shù)的外部對(duì)象組成的。函數(shù)是一個(gè)自我包含的完成一定相關(guān)功能的執(zhí)行代碼段。我們可以把函數(shù)看成一個(gè)'黑盒子',你只要將數(shù)據(jù)送進(jìn)去就能得到結(jié)果,而函數(shù)內(nèi)部究竟是如何工作的的,外部程序是不知道的。外部程序所知道的僅限于輸入給函數(shù)什么以及函數(shù)輸出什么。函數(shù)提供了編制程序的手段,使之容易讀、寫(xiě)、理解、排除錯(cuò)誤、修改和維護(hù)。
C程序中函數(shù)的數(shù)目實(shí)際上是不限的,如果說(shuō)有什么限制的話,那就是,一個(gè)C程序中必須至少有一個(gè)函數(shù),而且其中必須有一個(gè)并且僅有一個(gè)以main為名,這個(gè)函數(shù)稱為主函數(shù),整個(gè)程序從這個(gè)主函數(shù)開(kāi)始執(zhí)行。
C語(yǔ)言程序鼓勵(lì)和提倡人們把一個(gè)大問(wèn)題劃分成一個(gè)個(gè)子問(wèn)題,對(duì)應(yīng)于解決一個(gè)子問(wèn)題編制一個(gè)函數(shù),因此,C語(yǔ)言程序一般是由大量的小函數(shù)而不是由少量大函數(shù)構(gòu)成的,即所謂'小函數(shù)構(gòu)成大程序'。這樣的好處是讓各部分相互充分獨(dú)立,并且任務(wù)單一。因而這些充分獨(dú)立的小模塊也可以作為一種固定規(guī)格的小'構(gòu)件',用來(lái)構(gòu)成新的大程序。
C語(yǔ)言發(fā)展的那么多年來(lái),用C語(yǔ)言開(kāi)發(fā)的系統(tǒng)和程序浩如煙海。在發(fā)展的同時(shí)也積累了很多能直接使用的庫(kù)函數(shù)。
ANSIC提供了標(biāo)準(zhǔn)C語(yǔ)言庫(kù)函數(shù)。
C語(yǔ)言初學(xué)者比較喜歡的TurboC2.0提供了400多個(gè)運(yùn)行時(shí)函數(shù),每個(gè)函數(shù)都完成特定的功能,用戶可隨意調(diào)用。這些函數(shù)總體分成輸入輸出函數(shù)、數(shù)學(xué)函數(shù)、字符串和內(nèi)存函數(shù)、與BIOS和DOS有關(guān)的函數(shù)、字符屏幕和圖形功能函數(shù)、過(guò)程控制函數(shù)、目錄函數(shù)等。
Windows系統(tǒng)所提供的WindowsSDK中包含了數(shù)千個(gè)跟Windows應(yīng)用程序開(kāi)發(fā)相關(guān)的函數(shù)。
其他操作系統(tǒng),如Linux,也同樣提供了大量的函數(shù)讓?xiě)?yīng)用程序開(kāi)發(fā)人員調(diào)用。
作為程序員應(yīng)盡量熟悉目標(biāo)平臺(tái)庫(kù)函數(shù)其功能。這樣才能游刃有余地開(kāi)發(fā)特定平臺(tái)的應(yīng)用程序。比如作為Windows應(yīng)用程序的開(kāi)發(fā)者,應(yīng)盡量熟悉WindowsSDK;作為L(zhǎng)inux應(yīng)用程序開(kāi)發(fā)者,應(yīng)盡量熟悉Linux系統(tǒng)調(diào)用和POSIX函數(shù)規(guī)范。
運(yùn)算符號(hào)
比較特別的是,比特右移(>>)運(yùn)算符可以是算術(shù)(左端補(bǔ)最高有效位)或是邏輯(左端補(bǔ)0)位移。例如,將11100011右移3比特,算術(shù)右移后成為11111100,邏輯右移則為00011100。因算術(shù)比特右移較適于處理帶負(fù)號(hào)整數(shù),所以幾乎所有的編譯器都是算術(shù)比特右移。
運(yùn)算符的優(yōu)先級(jí)從高到低大致是:?jiǎn)文窟\(yùn)算符、算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、條件運(yùn)算符、賦值運(yùn)算符(=)和逗號(hào)運(yùn)算符。