和我們平時說話使用的語言一樣,任何編程語言都有它的語法要求,正所謂無規(guī)矩不成方圓,一門語言有了完善的規(guī)則才能成為一種可推廣的語言。上一篇內(nèi)容介紹的數(shù)據(jù)類型和各種運算符也是C語言基礎(chǔ)語法規(guī)則中的一部分。現(xiàn)在我們再來了解一下使用C語言編程時的一些細(xì)節(jié)問題。
●在編程時需要使用英文輸入法,或?qū)⑤斎敕ㄇ袚Q到英文狀態(tài)。這一點是必須要強調(diào)的,因為很多初學(xué)者編程是犯的錯誤都是因為符號使用了中文符號。雖然現(xiàn)在的編譯器有自動檢測符號的功能,你可以很容易檢測出問題所在,但還是希望初學(xué)者編程時潛意識里要自覺切換輸入法,這是程序員最基本的“修養(yǎng)”。
●C語言中是以英文符號(后文中的符號都是指英文符號)的分號";"作為一條邏輯語句的結(jié)束符,即一個“;”代表一條語句。在每一行代碼段中可以包含多條程序語句,只是為了可讀性我們一般不那樣做,良好的習(xí)慣就是一行一條語句,甚至在一些復(fù)雜的邏輯中我們可以把一條長的復(fù)雜語句分開寫成連續(xù)的多行,但在一些情況中需在每一行結(jié)尾使用“”作為連接符(其后不能有其他符號),所以編程時若要分行寫統(tǒng)一都加“”。
●C語言注釋,注釋是指在編程時程序員可以提供一些對程序的解釋說明等信息,這些內(nèi)容不會被編譯器編譯,不是有效的程序段。在C語言中可以以“//”作為行注釋,即一個“//”注釋一行代碼,另外也可以使用“/ 程序塊 /”進(jìn)行塊注釋,即包含的程序內(nèi)容都被注釋了。
●空行,C語言中的空格行是沒有意義的,我們?yōu)榱顺绦虻拿烙^和層次感可以在適當(dāng)位置添加一些空行。
●C語言是強類型語言,強類型語言指對變量定義要求比較高,變量必須先定義后使用,并且定義后不能隨便轉(zhuǎn)化,即使能轉(zhuǎn)化也需要一定條件,比如強制轉(zhuǎn)化。另外C語言對符號大小寫是敏感的,即大小寫變量不是同一個變量,比如A與a是兩個變量。
C語言關(guān)鍵字
C語言中具有特殊含義的英文單詞,通常用于構(gòu)成語句,存儲數(shù)據(jù),定義數(shù)據(jù)類型等嗎,我們定義變量或函數(shù)時不得與其相同!其中一些在上一篇中我們有見到過,有些是我們接下來馬上要講解的內(nèi)容,其余的后面再實例分析,一共有32個關(guān)鍵字,內(nèi)容見下表:
可以大致分類一下進(jìn)行記憶。
if與switch
正如if是英文字面意思“如果”,在C語言中使用if作為判斷語句,判斷結(jié)構(gòu)要求程序員指定一個或多個要評估或測試的條件,以及條件為真時要執(zhí)行的語句(必需的)和條件為假時要執(zhí)行的語句(可選的)。C 語言把任何非零和非空的值假定為 true,把零或 null 假定為 false。和我們平時說話做假設(shè)一樣,if可以單獨使用,它的使用方法與流程圖如下:
if (test expression)
{
//測試表達(dá)式為真時,執(zhí)行的語句
}
另外,它也可以和else一起使用,可以為各判斷條件設(shè)計程序塊,也可以使用多個else分支,使用方法和流程圖如下:
例一:
if (test expression)
{
//測試表達(dá)式為真時,要執(zhí)行的語句
}
else
{
// 如果測試表達(dá)式為假,則執(zhí)行的語句
}
例二:
if (test expression1)
{
// 語句
}
else if(test expression2)
{
// 語句
}
else if (test expression3)
{
// 語句
}
……
else
{
// 語句
}
另外if語句還可以進(jìn)行嵌套,也就是在判斷中再進(jìn)行判斷,如果有的話也可以接著繼續(xù)嵌套下去,想想一下套娃就明白了,道理是一樣的,這應(yīng)該很容易明白吧。
在C語言中除了使用if進(jìn)行判斷也可以使用switch語句做條件判斷,它也被稱為開關(guān)語句,在某個判斷邏輯下,如果有多個與之對應(yīng)的結(jié)果,這時我們就可以使用它來實現(xiàn)出現(xiàn)那個結(jié)果就進(jìn)入那個分支,這兩種語法在一定條件下是可以互轉(zhuǎn)的,并且各有優(yōu)勢,其中switch必須配合case關(guān)鍵字一起使用,通常也會搭配break,continu,default語言使用。我們看一下它的使用方法與流程圖:
switch (expression)
{
case constant1:
// 語句
break;
case constant2:
// 語句
break;
……
default:
// 默認(rèn)語句
}
和if一樣它也可以進(jìn)行嵌套,這要邏輯合理即可,在使用過程中,我們通常會根據(jù)實際的使用需求來決定具體使用它兩中的那種,一般來時如果是簡單的條件判斷那肯定是使用if比較簡介,如果應(yīng)用場景中有很多相似分支,那我們就可以選擇使用switch。
if (test expression1)
{
if (test expression)
{
//測試表達(dá)式為真時,要執(zhí)行的語句
}
else
{
// 如果測試表達(dá)式為假,則執(zhí)行的語句
}
}
else if(test expression2)
{
if (test expression)
{
//測試表達(dá)式為真時,要執(zhí)行的語句
}
else
{
// 如果測試表達(dá)式為假,則執(zhí)行的語句
}
}
……
當(dāng)然以上都是典型的一些用法,在具體使用時還可以對它們進(jìn)行相互嵌套,有了良好的編程邏輯后我們要學(xué)會靈活運用這些知識。
for與while
在C語言中當(dāng)我們需要進(jìn)行循環(huán)操作,這時就可以使用for或while語句了,這兩個詞的英文本意都有“直到xx才xx”的意思,只不過它們使用的語法各有差別,但兩者都可以實現(xiàn)互換。我們來看一下它們的具體使用方法。
以下是while的循環(huán)流程圖,如果條件成立就一直執(zhí)行,不成立就退出。
while (testExpression)
{
// 循環(huán)體中的語句
}
while還有一種使用方法是與do配合使用,就是不管條件怎么先執(zhí)行一遍再詢問條件,其實就是換了一種說法而已,但它們的不同就是在于前者先判斷后執(zhí)行,后者先執(zhí)行再判斷,使用時序根據(jù)語意選擇合適方式,它的具體方法和執(zhí)行流程如下:
do
{
//循環(huán)體內(nèi)的語句
}
while (testExpression);
for循環(huán)語句相對while和do…while使用格式有些不一樣,但意思是差不多的,我們來看一下:
for (initializationStatement; testExpression; updateStatement)
{
//循環(huán)體內(nèi)的語句
}
以上3中循環(huán)方式各有各的特點,使用時根據(jù)語境進(jìn)行選擇。for循環(huán)語句的流程圖看起來比其他兩者復(fù)雜,其實使用起來還是很方便的,后面我們在再分別舉例對比測試。
循環(huán)語句也可以搭配break,continu對循環(huán)進(jìn)行控制,甚至能與goto語句一起使用,但goto語句容易引起程序結(jié)構(gòu)混亂一般不建議使用,我個人建議最好別用,所以不做講解,有興趣的朋友可以自行了解一下。
C語言定義函數(shù)
學(xué)會以上條件,和循環(huán)語句后,雖然你可能還是不會編程,但一些基本的編程的邏輯思維應(yīng)該是清楚了吧,現(xiàn)在來講解一下我們編程需要掌握的最后一個環(huán)節(jié),它就是定義函數(shù)。我們肯定已經(jīng)知道變量,常量是什么了,又知道了程序運行時的一些判斷邏輯了,假設(shè)現(xiàn)在要你設(shè)計一個控制LED一閃一閃的程序,你腦海里應(yīng)該有一個大概的想法了吧?先點亮LED,各一段時間再熄滅LED,然后再繼續(xù)重復(fù),對吧,程序邏輯就是這么簡單!那么,我們要怎么執(zhí)行這些程序段呢?這就需要我們設(shè)置一個函數(shù)了,在C語言中一段代碼要能執(zhí)行必須包含一個函數(shù),這個函數(shù)就是main函數(shù),也叫主函數(shù)。所有的程序運行都是從main函數(shù)開始,可能不好理解,簡單來說就是,main函數(shù)是必不可少的,當(dāng)程序編譯成機器代碼時編譯器會先找程序中是main函數(shù),找到了就進(jìn)入函數(shù)繼續(xù)編譯,沒找到就報錯。
除了main函數(shù)之外,我們編程是可以將某個功能模塊的代碼封裝成一個函數(shù),然后在使用時直接調(diào)用,這樣就可以讓我們的代碼可讀性更強,可維護性更高。
我們來看一下函數(shù)的的基本內(nèi)容:
●函數(shù)聲明 :必須在C程序中全局聲明函數(shù),以告知編譯器函數(shù)名稱,函數(shù)參數(shù)和返回類型。
●函數(shù)定義:它包含要執(zhí)行的實際語句。這是調(diào)用函數(shù)時控件所涉及的最重要方面。在這里,我們必須注意,該函數(shù)只能返回一個值。
●函數(shù)調(diào)用:可以從程序中的任何位置調(diào)用函數(shù)。參數(shù)列表在函數(shù)調(diào)用和函數(shù)聲明中要相同。我們必須傳遞與函數(shù)聲明中聲明的函數(shù)數(shù)量相同的函數(shù)。
以上說明可能比較專業(yè)化,簡單來說就是和變量的使用規(guī)則一樣,所有函數(shù)都要先定義后使用,并且如果你定義的位置在調(diào)用的位置之后,或函數(shù)定義和調(diào)用不在同一個文件那就必須在函數(shù)調(diào)用的之前對定義好的函數(shù)進(jìn)行聲明。對于初學(xué)者來說這是函數(shù)的一個難點,我們后續(xù)會在使用案例中做更詳細(xì)的講解。
學(xué)會使用函數(shù)之后你就可以嘗試寫出自己的模塊功能代碼了,以后再使用相同功能時復(fù)制過去就可以進(jìn)行使用測試了。
函數(shù)定義示例:
return_type function_name(data_type parameter...)
{
//要執(zhí)行的代碼
}
printf與scanf
屏幕和鍵盤是計算機與外界進(jìn)行人機交互的主要工具,C語言中我們可以編程通過屏幕顯示信息,也可以通過鍵盤進(jìn)行輸入信息。C語言中最基礎(chǔ)的向屏幕輸出信息的函數(shù)是printf,scanf是其對應(yīng)的獲取鍵盤輸入信息的函數(shù)。但是它們時需要一定規(guī)則才能正確執(zhí)行操作的。其中使用到的一些特殊字符進(jìn)行轉(zhuǎn)義再使用某些特定字符進(jìn)行格式化輸入,輸出,具體如下表介紹:
這些是我們需要熟練使用的,編程練習(xí)的過程中多嘗試就可以容易的記住了。在51電單片機中是不可能驅(qū)動得了電腦屏幕這么復(fù)雜的設(shè)備的,但我們可以應(yīng)用串口連接電腦,在通過這些函數(shù)在串口助手這樣的小工具上輸入輸出信息從而實現(xiàn)人機交換的目的。
C語言程序文件
C語言中編寫的代碼可能文件主要有.c和.h文件,.c文件就是我們存放代碼的主要文件,.h文件叫頭文件,它用來存放變量,函數(shù)的聲明以及使用到的其他.h文件等。我們把定義的變量,函數(shù)以及其他一些實現(xiàn)代碼功能必要的內(nèi)容保持在.c文件里。如果是簡單的程序,我們直接在一個.c文件里面編寫就可以了,但以后需要寫更復(fù)雜的程序時我們就要學(xué)會將代碼分類,把個部分功能不相同的代碼用不同的.c文件保存,并分別為它們添加一個名稱相同的.h文件(名稱也可以不同,只是為了方便管理,所以最好是保存一致),這種方法就是模塊化編程方法,這是做項目開發(fā)時必須會使用的一種編程思維。現(xiàn)在不懂沒關(guān)系,后面我們再一一講解。
C語言庫函數(shù)
前面我們說到了自己定義函數(shù),分類打包函數(shù),其實只要你安裝了C語言編譯器,在我們電腦系統(tǒng)里就會包含很多C語言源代碼了,這些代碼大多數(shù)都是官方編寫的,我們稱它們?yōu)楣俜綆煳募?。這些文件中就包含了官方庫函數(shù),我們可以直接調(diào)用它們。有了官方庫文件之后我們才能順利執(zhí)行我們自己編寫的代碼,事實上我們編寫的最簡單的例子都會使用到庫文件,所以想快速學(xué)習(xí)模塊化編程的朋友不妨看一下官方的代碼時怎么寫的。具體的知識我們后面子再一一講解。
評論
查看更多