分析程序
????我們學(xué)習(xí)了怎么樣創(chuàng)建一個(gè)C源碼文件(后綴是.c的文件耗帕,例如test.c),然后盐茎,編譯程序兴垦,得到可執(zhí)行的程序,最終執(zhí)行程序字柠。
????現(xiàn)在探越,我們來分析C源碼文件中的C程序,就是所謂的“代碼”窑业。這個(gè)C程序的代碼如下:
#include?<stdio.h> //包含頭文件, 為了使用printf()函數(shù);
#include?<stdlib.h> //包含頭文件, 為了使用system()函數(shù);
int?main() //定義程序的主函數(shù), 就是程序的入口地址;
{ //主函數(shù)的開始標(biāo)記;
????printf("Now time =\n"); //輸出提示;
????system("date"); //輸出系統(tǒng)時(shí)間;
????return?0; //返回結(jié)束狀態(tài);
} //主函數(shù)的結(jié)束標(biāo)記;
????現(xiàn)在我們來分析一個(gè)C程序主要有3部分組成:
(1)包含頭文件钦幔,引用系統(tǒng)提供的接口函數(shù);
(2)程序的主函數(shù)常柄,即程序的入口地址鲤氢,程序從哪個(gè)地方開始執(zhí)行;
(3)程序語句西潘,實(shí)現(xiàn)程序功能的具體指令卷玉;如果把程序比作一棟大樓,那么喷市,程序語句就是組成大樓的鋼筋水泥相种;
3.1包含頭文件
????舉個(gè)例子,如果大家要起一棟大樓品姓,會(huì)用到鐵鏟寝并、推車之類的工具箫措。這些工具會(huì)存放在某個(gè)指定的地方,一般稱為“倉(cāng)庫”衬潦。同樣斤蔓,程序中使用到了printf()這樣的函數(shù),這些函數(shù)如同鐵鏟之類的工具镀岛,存放在C語言的“倉(cāng)庫”中弦牡。那么,在C語言中哎媚,這些倉(cāng)庫我們可以稱為“頭文件”喇伯。
????C語言中定義的頭文件,就是以.h為結(jié)尾的文件拨与。例如 stdio.h稻据、stdlib.h文件,就是系統(tǒng)提供的頭文件买喧。如同C語言提供的“倉(cāng)庫”捻悯,里面存放了許多有用的鐵鏟、推車等工具淤毛,使用這些工具今缚,我們就可以開發(fā)出一個(gè)程序。
????要在代碼中引用指定的頭文件低淡,格式如下:
#include <xxx.h>
????其中xxx的頭文件的名稱姓言。這個(gè)格式是固定的,前面必須是 #include 關(guān)鍵字蔗蹋,然后使用尖括號(hào)“< >”何荚,中間是引用的 .h 頭文件。
????所以猪杭,我們知道了頭文件的作用餐塘,就是一個(gè)倉(cāng)庫,存放很多編碼使用的工具皂吮。我們必須使用倉(cāng)庫中的工具戒傻,才可以進(jìn)行編碼。隨著學(xué)習(xí)的深入蜂筹,我們可以定義自己的倉(cāng)庫需纳,存放自己定義的函數(shù)模塊。就是定義自己的.h頭文件艺挪,然后不翩,聲明引出自己定義的函數(shù),讓其他模塊使用。
3.2程序的入口
????讀書的時(shí)候慌盯,每一個(gè)學(xué)校都有一個(gè)校門口,要合法掂器、正規(guī)地進(jìn)入學(xué)校亚皂,就只能夠通過校門口進(jìn)入。當(dāng)然也可以通過翻墻等行為進(jìn)出學(xué)校国瓮,但是都不是學(xué)校所允許的灭必。同樣的道理,每一個(gè)程序要能夠操作系統(tǒng)上正常運(yùn)行乃摹,都必須提供一個(gè)入口禁漓,讓操作系統(tǒng)通過這個(gè)入口,加載程序中的數(shù)據(jù)孵睬,然后播歼,運(yùn)行程序。
????C語言中定義了程序入口掰读,就是main函數(shù)秘狞。在我們的測(cè)試?yán)又校校?/p>
????int?main() //定義程序的主函數(shù), 就是程序的入口地址;
{ //主函數(shù)的開始標(biāo)記;
????printf("Now time =\n"); //輸出提示;
????system("date"); //輸出系統(tǒng)時(shí)間;
????return?0; //返回結(jié)束狀態(tài);
} //主函數(shù)的結(jié)束標(biāo)記;
????這就是定義了main函數(shù)蹈集,這個(gè)main函數(shù)的定義是:
(1)函數(shù)的返回值類型是 int類型烁试,就是返回一個(gè)int類型的數(shù)據(jù);
(2)函數(shù)名的名稱必須是main關(guān)鍵詞拢肆;
(3)函數(shù)名main后面接一個(gè)小括號(hào)()减响,括號(hào)里是空,表示不攜帶參數(shù)郭怪;
(4)在小括號(hào)()后面接一個(gè)大括號(hào){ }支示,這個(gè)大括號(hào){ }中的代碼就是main函數(shù)要執(zhí)行的代碼;
(5)執(zhí)行代碼的最后移盆,通過 return 關(guān)鍵字返回0數(shù)值悼院,就是為了符合main函數(shù)開始定義時(shí),要求返回int類型的變量咒循。
????在這里据途,我們講解了main函數(shù)的定義,主要是說明main函數(shù)是程序的入口地址叙甸,如同一個(gè)學(xué)校的校門口一樣颖医,要通過校門口,才可以進(jìn)入學(xué)校裆蒸。同樣熔萧,main函數(shù)提供了程序的入口地址,所以,我們要寫的程序代碼佛致,就是在main函數(shù)中編寫贮缕,main函數(shù)被操作系統(tǒng)調(diào)用之后,我們寫的程序代碼也就被操作系統(tǒng)調(diào)用執(zhí)行俺榆。
????所以感昼,在main函數(shù)中,我們就編寫了需要執(zhí)行的代碼罐脊。 操作系統(tǒng)把程序加載到內(nèi)存之后定嗓,找到main函數(shù)這個(gè)入口,然后萍桌,就一條一條地執(zhí)行我們編寫的代碼宵溅。
3.3函數(shù)體的代碼
????程序的入口是從main函數(shù)開始,所以上炎,我們要實(shí)現(xiàn)的代碼也就是在main函數(shù)的函數(shù)體中編寫恃逻。main函數(shù)的定義格式是:
int?main() //定義程序的主函數(shù), 就是程序的入口地址;
{
} //主函數(shù)的結(jié)束標(biāo)記;
????那么,函數(shù)體就是在大括號(hào){ }中的代碼藕施。在測(cè)試?yán)又行量椋瘮?shù)體中的代碼是:
printf("Now time =\n"); //輸出提示;
system("date"); //輸出系統(tǒng)時(shí)間;
return?0; //返回結(jié)束狀態(tài);
????這些代碼的作用是:
(1) printf函數(shù)輸出 "Now time=\n" 字符串中的數(shù)據(jù),后面的"\n"表示回車換行铅碍;
(2) system函數(shù)執(zhí)行參數(shù)"date"指定的動(dòng)作润绵,獲取系統(tǒng)時(shí)間輸出;
(3) return關(guān)鍵字返回一個(gè)值胞谈,表示退出main函數(shù)的運(yùn)行尘盼;
????注意:每一行代碼必須以引號(hào)“;”結(jié)束。除了遇到如下幾種特殊情況:
(1)使用#include包含頭文件烦绳,不需要引號(hào)結(jié)束卿捎;
(2)函數(shù)的聲明,在小括號(hào)()后面径密,不需要引號(hào)結(jié)束午阵;
(3)函數(shù)體的大括號(hào){}后面,不需要引號(hào)結(jié)束享扔;
????那么底桂,當(dāng)我們學(xué)習(xí)了變量,運(yùn)算符惧眠,表達(dá)式籽懦,輸入/輸出函數(shù)等知識(shí)之后,就可以自由編寫函數(shù)體中的代碼氛魁,實(shí)現(xiàn)更加復(fù)雜的功能暮顺。我們可以把想要計(jì)算機(jī)實(shí)現(xiàn)的功能通過C語言來描述厅篓,然后,編譯成可執(zhí)行程序來運(yùn)行捶码。
3.4程序的注釋
????我們先來看看一個(gè)測(cè)試?yán)樱?/p>
#include?<stdio.h> //包含頭文件, 為了使用printf()函數(shù);
int?main() //定義程序的主函數(shù), 就是程序的入口地址;
{ //主函數(shù)的開始標(biāo)記;
/*注釋
可以注釋多行
代碼*/
printf("test abc!\n");
return?0; //返回結(jié)束狀態(tài);
}
????測(cè)試運(yùn)行結(jié)果如下:
mylinux@ubuntu:~/src/test$ gcc test.c -o exe
mylinux@ubuntu:~/src/test$ ./exe
test abc!
????在這個(gè)測(cè)試?yán)又杏鸬覀冎饕v解C語言的“注釋”。在代碼中添加注釋很有必要惫恼,例如乏苦,我們需要描述某一段關(guān)鍵的代碼,描述某一個(gè)函數(shù)模塊的時(shí)候尤筐,就需要在代碼中添加注釋,那么洞就,當(dāng)一個(gè)項(xiàng)目有多個(gè)開發(fā)人員在共同開發(fā)時(shí)盆繁,大家可以通過代碼的注釋來快速了解代碼的構(gòu)造和設(shè)計(jì)。
????C語言提供了兩種中注釋方法:
(1)單行注釋
在一行中旬蟋,以兩個(gè)反斜杠“//”開始油昂,后面接著的數(shù)據(jù)就是注釋。注釋的數(shù)據(jù)不會(huì)被編譯器編譯倾贰,所以冕碟,注釋里面寫的東西可以中文或其他字符,不要求是C語言寫的代碼匆浙。注意:“//”注釋符只能夠在單一行中使用安寺,不能夠跨越多行。例如上面的例子中首尼,有:
int main() //定義程序的主函數(shù), 就是程序的入口地址;
這是合法的挑庶,因?yàn)樽⑨尫?/”后面接的數(shù)據(jù)都是在一行中。
(2)多行注釋
????“多行注釋”也稱為“塊注釋”软能,就是可以注釋多行代碼塊迎捺。多行注釋是以“/*”開始,以“*/”結(jié)束查排。例如上面例子中的代碼有:
/*注釋
可以注釋多行
代碼*/
printf("test abc!\n");
????就是通過/* ?*/來注釋多行凳枝。注意,多行注釋符 /* */ 不能夠嵌套跋核,不能夠編寫 /* abc /*123*/www*/ 這樣的嵌套注釋岖瑰,嵌套注釋是不允許的。
????多行注釋的規(guī)則是:從第一個(gè)/*符號(hào)開始砂代,遇到第一個(gè) */ 符號(hào)結(jié)束锭环。所以,對(duì)于 /* abc /*123*/www*/ 這樣的嵌套注釋泊藕,只是注釋了 /* abc /*123*/ 數(shù)據(jù)辅辩,剩下的 www*/沒有配對(duì)难礼,所以,是不合法的玫锋。