第一章: C語(yǔ)言概論
C語(yǔ)言的發(fā)展過(guò)程
C語(yǔ)言是在70年代初問(wèn)世的。一九七八年由美國(guó)電話(huà)電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語(yǔ)言。同時(shí)由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一書(shū)。通常簡(jiǎn)稱(chēng)為《K&R》,也有人稱(chēng)之為《K&R》標(biāo)準(zhǔn)。但是,在《K&R》中并沒(méi)有定義一個(gè)完整的標(biāo)準(zhǔn)C語(yǔ)言,后來(lái)由美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)在此基礎(chǔ)上制定了一個(gè)C 語(yǔ)言標(biāo)準(zhǔn),于一九八三年發(fā)表。通常稱(chēng)之為ANSI C。
當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語(yǔ)言
早期的C語(yǔ)言主要是用于UNIX系統(tǒng)。由于C語(yǔ)言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸為人們認(rèn)識(shí),到了八十年代,C開(kāi)始進(jìn)入其它操作系統(tǒng),并很快在各類(lèi)大、中、小和微型計(jì)算機(jī)上得到了廣泛的使用。成為當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語(yǔ)言之一。
C語(yǔ)言的特點(diǎn)
C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言。它層次清晰,便于按模塊化方式組織程序,易于調(diào)試和維護(hù)。C語(yǔ)言的表現(xiàn)能力和處理能力極強(qiáng)。它不僅具有豐富的運(yùn)算符和數(shù)據(jù)類(lèi)型,便于實(shí)現(xiàn)各類(lèi)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。它還可以直接訪(fǎng)問(wèn)內(nèi)存的物理地址,進(jìn)行位(bit)一級(jí)的操作。由于C語(yǔ)言實(shí)現(xiàn)了對(duì)硬件的編程操作,因此C語(yǔ)言集高級(jí)語(yǔ)言和低級(jí)語(yǔ)言的功能于一體。既可用于系統(tǒng)軟件的開(kāi)發(fā),也適合于應(yīng)用軟件的開(kāi)發(fā)。此外,C語(yǔ)言還具有效率高,可移植性強(qiáng)等特點(diǎn)。因此廣泛地移植到了各類(lèi)各型計(jì)算機(jī)上,從而形成了多種版本的C語(yǔ)言。
C語(yǔ)言版本
目前最流行的C語(yǔ)言有以下幾種:
·Microsoft C 或稱(chēng) MS C
·Borland Turbo C 或稱(chēng) Turbo C
·AT&T C
這些C語(yǔ)言版本不僅實(shí)現(xiàn)了ANSI C標(biāo)準(zhǔn),而且在此基礎(chǔ)上各自作了一些擴(kuò)充,使之更加方便、完美。
面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言
在C的基礎(chǔ)上,一九八三年又由貝爾實(shí)驗(yàn)室的Bjarne Strou-strup推出了C++。C++進(jìn)一步擴(kuò)充和完善了C語(yǔ)言,成為一種面向 對(duì)象的程序設(shè)計(jì)語(yǔ)言。C++目前流行的最新版本是Borland C++4.5,=Symantec C++6.1,和Microsoft VisualC++ 2.0.C++提出了一些更為深入的概念,它所支持的這些面向?qū)ο蟮母拍钊菀讓?wèn)題空間直接地映射到程序空間,為程序員提供了一種與傳統(tǒng)結(jié)構(gòu)程序設(shè)計(jì)不同的思維方式和編程方法。因而也增加了整個(gè)語(yǔ)言的復(fù)雜性,掌握起來(lái)有一定難度。
C和C++
但是,C是C++的基礎(chǔ),C++語(yǔ)言和C語(yǔ)言在很多方面是兼容的。因此,掌握了C語(yǔ)言,再進(jìn)一步學(xué)習(xí)C++就能以一種熟悉的語(yǔ)法來(lái)學(xué)習(xí)面向?qū)ο蟮恼Z(yǔ)言,從而達(dá)到事半功倍的目的。
C源程序的結(jié)構(gòu)特點(diǎn)
為了說(shuō)明C語(yǔ)言源程序結(jié)構(gòu)的特點(diǎn),先看以下幾個(gè)程序。這幾個(gè)程 序由簡(jiǎn)到難,表現(xiàn)了C語(yǔ)言源程序在組成結(jié)構(gòu)上的特點(diǎn)。雖然有關(guān)內(nèi)容還未介紹,但可從這些例子中了解到組成一個(gè)C源程序的基本部分和書(shū)寫(xiě)格式。
main()
{
printf("c語(yǔ)言世界www.vcok.com,您好!\n");
}
main是主函數(shù)的函數(shù)名,表示這是一個(gè)主函數(shù)。每一個(gè)C源程序都必須有,且只能有一個(gè)主函數(shù)(main函數(shù))。函數(shù)調(diào)用語(yǔ)句,printf函數(shù)的功能是把要輸出的內(nèi)容送到顯示器去顯示。printf函數(shù)是一個(gè)由系統(tǒng)定義的標(biāo)準(zhǔn)函數(shù),可在程序中直接調(diào)用。
#include "stdio.h"
#include "math.h"
main()
{
double x,s;
printf("input number:\n");
scanf("%lf",&x);
s=sin(x);
printf("sine of %lf is %lf\n",x,s);
}
每行注釋
include稱(chēng)為文件包含命令擴(kuò)展名為.h的文件也稱(chēng)為頭文件或首部文件。
定義兩個(gè)實(shí)數(shù)變量,以被后面程序使用。
顯示提示信息。
從鍵盤(pán)獲得一個(gè)實(shí)數(shù)x。
求x的正弦,并把它賦給變量s。
顯示程序運(yùn)算結(jié)果。
main函數(shù)結(jié)束。
程序的功能是從鍵盤(pán)輸入一個(gè)數(shù)x,求x的正弦值,然后輸出結(jié)果。在main()之前的兩行稱(chēng)為預(yù)處理命令(詳見(jiàn)后面)。預(yù)處理命令還有其它幾種,這里的include 稱(chēng)為文件包含命令,其意義是把尖括號(hào)""或引號(hào)<>內(nèi)指定的文件包含到本程序來(lái),成為本程序的一部分。被包含的文件通常是由系統(tǒng)提供的,其擴(kuò)展名為。h.因此也稱(chēng)為頭文件或首部文件。C語(yǔ)言的頭文件中包括了各個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)的函數(shù)原型。因此,凡是在程序中調(diào)用一個(gè)庫(kù)函數(shù)時(shí),都必須包含該函數(shù)原型所在的頭文件。在本例中,使用了三個(gè)庫(kù)函數(shù):輸入函數(shù)scanf,正弦函數(shù)sin,輸出函數(shù)printf.sin函數(shù)是數(shù)學(xué)函數(shù),其頭文件為math.h文件,因此在程序的主函數(shù)前用include命令包含了math.h.scanf和printf是標(biāo)準(zhǔn)輸入輸出函數(shù),其頭文件為stdio.h,在主函數(shù)前也用include命令包含了stdio.h文件。
需要說(shuō)明的是,C語(yǔ)言規(guī)定對(duì)scanf和printf這兩個(gè)函數(shù)可以省去對(duì)其頭文件的包含命令。所以在本例中也可以刪去第二行的包含命令#include。同樣,在例1.1中使用了printf函數(shù),也省略了包含命令。
在例題中的主函數(shù)體中又分為兩部分,一部分為說(shuō)明部分,另一部分執(zhí)行部分。說(shuō)明是指變量的類(lèi)型說(shuō)明。例題中未使用任何變量,因此無(wú)說(shuō)明部分。C語(yǔ)言規(guī)定,源程序中所有用到的變量都必須先說(shuō)明,后使用,否則將會(huì)出錯(cuò)。這一點(diǎn)是編譯型高級(jí)程序設(shè)計(jì)語(yǔ)言的一個(gè)特點(diǎn),與解釋型的BASIC語(yǔ)言是不同的。說(shuō)明部分是C源程序結(jié)構(gòu)中很重要的組成部分。本例中使用了兩個(gè)變量x,s,用來(lái)表示輸入的自變量和sin函數(shù)值。由于sin函數(shù)要求這兩個(gè)量必須是雙精度浮點(diǎn)型,故用類(lèi)型說(shuō)明符double來(lái)說(shuō)明這兩個(gè)變量。說(shuō)明部分后的四行為執(zhí)行部分或稱(chēng)為執(zhí)行語(yǔ)句部分,用以完成程序的功能。執(zhí)行部分的第一行是輸出語(yǔ)句,調(diào)用printf函數(shù)在顯示器上輸出提示字符串,請(qǐng)操作人員輸入自變量x的值。第二行為輸入語(yǔ)句,調(diào)用scanf函數(shù),接受鍵盤(pán)上輸入的數(shù)并存入變量x中。第三行是調(diào)用sin函數(shù)并把函數(shù)值送到變量s中。第四行是用printf 函數(shù)輸出變量s的值,即x的正弦值。程序結(jié)束。
printf("input number:\n");
scanf("%lf",'C10F10&x);
s=sin(x);
printf("sine of %lf is %lf\n",'C10F10x,s);
運(yùn)行本程序時(shí),首先在顯示器屏幕上給出提示串input number,這是由執(zhí)行部分的第一行完成的。用戶(hù)在提示下從鍵盤(pán)上鍵入某一數(shù),如5,按下回車(chē)鍵,接著在屏幕上給出計(jì)算結(jié)果。
輸入和輸出函數(shù)
在前兩個(gè)例子中用到了輸入和輸出函數(shù)scanf和 printf,在第三章中我們要詳細(xì)介紹。這里我們先簡(jiǎn)單介紹一下它們的格式,以便下面使用。scanf和 printf這兩個(gè)函數(shù)分別稱(chēng)為格式輸入函數(shù)和格式輸出函數(shù)。其意義是按指定的格式輸入輸出值。因此,這兩個(gè)函數(shù)在括號(hào)中的參數(shù)表都由以下兩部分組成:“格式控制串”,參數(shù)表 格式控制串是一個(gè)字符串,必須用雙引號(hào)括起來(lái),它表示了輸入輸出量的數(shù)據(jù)類(lèi)型。各種類(lèi)型的格式表示法可參閱第三章。在printf函數(shù)中還可以在格式控制串內(nèi)出現(xiàn)非格式控制字符,這時(shí)在顯示屏幕上將原文照印。參數(shù)表中給出了輸入或輸出的量。當(dāng)有多個(gè)量時(shí),用逗號(hào)間隔。例如:
printf("sine of %lf is %lf\n",x,s);
其中%lf為格式字符,表示按雙精度浮點(diǎn)數(shù)處理。它在格式串中兩次現(xiàn),對(duì)應(yīng)了x和s兩個(gè)變量。其余字符為非格式字符則照原樣輸出在屏幕上。
int max(int a,int b);
main()
{
int x,y,z;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
z=max(x,y);
printf("maxmum=%d",z);
}
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
此函數(shù)的功能是輸入兩個(gè)整數(shù),輸出其中的大數(shù)。
/*函數(shù)說(shuō)明*/
/*主函數(shù)*/
/*變量說(shuō)明*/
/*輸入x,y值*/
/*調(diào)用max函數(shù)*/
/*輸出*/
/*定義max函數(shù)*/
/*把結(jié)果返回主調(diào)函數(shù)*/
上面例中程序的功能是由用戶(hù)輸入兩個(gè)整數(shù),程序執(zhí)行后輸出其中較大的數(shù)。本程序由兩個(gè)函數(shù)組成,主函數(shù)和max 函數(shù)。函數(shù)之間是并列關(guān)系?蓮闹骱瘮(shù)中調(diào)用其它函數(shù)。max 函數(shù)的功能是比較兩個(gè)數(shù),然后把較大的數(shù)返回給主函數(shù)。max 函數(shù)是一個(gè)用戶(hù)自定義函數(shù)。因此在主函數(shù)中要給出說(shuō)明(程序第三行)?梢(jiàn),在程序的說(shuō)明部分中,不僅可以有變量說(shuō)明,還可以有函數(shù)說(shuō)明。關(guān)于函數(shù)的詳細(xì)內(nèi)容將在第五章介紹。在程序的每行后用/*和*/括起來(lái)的內(nèi)容為注釋部分,程序不執(zhí)行注釋部分。
上例中程序的執(zhí)行過(guò)程是,首先在屏幕上顯示提示串,請(qǐng)用戶(hù)輸入兩個(gè)數(shù),回車(chē)后由scanf函數(shù)語(yǔ)句接收這兩個(gè)數(shù)送入變量x,y中,然后調(diào)用max函數(shù),并把x,y 的值傳送給max函數(shù)的參數(shù)a,b。在max函數(shù)中比較a,b的大小,把大者返回給主函數(shù)的變量z,最后在屏幕上輸出z的值。
C源程序的結(jié)構(gòu)特點(diǎn)
1.一個(gè)C語(yǔ)言源程序可以由一個(gè)或多個(gè)源文件組成。
2.每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成。
3.一個(gè)源程序不論由多少個(gè)文件組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù)。
4.源程序中可以有預(yù)處理命令(include 命令僅為其中的一種),預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。
5.每一個(gè)說(shuō)明,每一個(gè)語(yǔ)句都必須以分號(hào)結(jié)尾。但預(yù)處理命令,函數(shù)頭和花括號(hào)“}”之后不能加分號(hào)。
6.標(biāo)識(shí)符,關(guān)鍵字之間必須至少加一個(gè)空格以示間隔。若已有明顯的間隔符,也可不再加空格來(lái)間隔。
書(shū)寫(xiě)程序時(shí)應(yīng)遵循的規(guī)則
從書(shū)寫(xiě)清晰,便于閱讀,理解,維護(hù)的角度出發(fā),在書(shū)寫(xiě)程序時(shí) 應(yīng)遵循以下規(guī)則:
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)格。
C語(yǔ)言的字符集
字符是組成語(yǔ)言的最基本的元素。C語(yǔ)言字符集由字母,數(shù)字,空格,標(biāo)點(diǎn)和特殊字符組成。在字符常量,字符串常量和注釋中還可以使用漢字或其它可表示的圖形符號(hào)。
1.字母 小寫(xiě)字母a~z共26個(gè),大寫(xiě)字母A~Z共26個(gè);
2.數(shù)字 0~9共10個(gè);
3.空白符 空格符、制表符、換行符等統(tǒng)稱(chēng)為空白符。空白符只在字符常量和字符串常量中起作用。在其它地方出現(xiàn)時(shí),只起間隔作用, 編譯程序?qū)λ鼈兒雎浴R虼嗽诔绦蛑惺褂每瞻追c否,對(duì)程序的編譯不發(fā)生影響,但在程序中適當(dāng)?shù)牡胤绞褂每瞻追麑⒃黾映绦虻那逦院涂勺x性。
4.標(biāo)點(diǎn)和特殊字符
C語(yǔ)言詞匯
在C語(yǔ)言中使用的詞匯分為六類(lèi):標(biāo)識(shí)符,關(guān)鍵字,運(yùn)算符,分隔符,常量,注釋符等。
1.標(biāo)識(shí)符
在程序中使用的變量名、函數(shù)名、標(biāo)號(hào)等統(tǒng)稱(chēng)為標(biāo)識(shí)符。除庫(kù)函數(shù)的函數(shù)名由系統(tǒng)定義外,其余都由用戶(hù)自定義。C 規(guī)定,標(biāo)識(shí)符只能是字母(A~Z,a~z)、數(shù)字(0~9)、下劃線(xiàn)()組成的字符串,并且其第一個(gè)字符必須是字母或下劃線(xiàn)。
以下標(biāo)識(shí)符是合法的:
a,x,_3x,BOOK_1,sum5
以下標(biāo)識(shí)符是非法的:
3s 以數(shù)字開(kāi)頭
s*T 出現(xiàn)非法字符*
-3x 以減號(hào)開(kāi)頭
bowy-1 出現(xiàn)非法字符-(減號(hào))
在使用標(biāo)識(shí)符時(shí)還必須注意以下幾點(diǎn):
(1)標(biāo)準(zhǔn)C不限制標(biāo)識(shí)符的長(zhǎng)度,但它受各種版本的C 語(yǔ)言編譯系統(tǒng)限制,同時(shí)也受到具體機(jī)器的限制。例如在某版本C 中規(guī)定標(biāo)識(shí)符前八位有效,當(dāng)兩個(gè)標(biāo)識(shí)符前八位相同時(shí),則被認(rèn)為是同一個(gè)標(biāo)識(shí)符。
(2)在標(biāo)識(shí)符中,大小寫(xiě)是有區(qū)別的。例如BOOK和book 是兩個(gè)不同的標(biāo)識(shí)符。
(3)標(biāo)識(shí)符雖然可由程序員隨意定義,但標(biāo)識(shí)符是用于標(biāo)識(shí)某個(gè)量的符號(hào)。因此,命名應(yīng)盡量有相應(yīng)的意義,以便閱讀理解,作到"顧名思義".
2.關(guān)鍵字
關(guān)鍵字是由C語(yǔ)言規(guī)定的具有特定意義的字符串,通常也稱(chēng)為保留字。用戶(hù)定義的標(biāo)識(shí)符不應(yīng)與關(guān)鍵字相同。C語(yǔ)言的關(guān)鍵字分為以下幾類(lèi):
(1)類(lèi)型說(shuō)明符
用于定義、說(shuō)明變量、函數(shù)或其它數(shù)據(jù)結(jié)構(gòu)的類(lèi)型。如前面例題中用到的int,double等
(2)語(yǔ)句定義符
用于表示一個(gè)語(yǔ)句的功能。如例1.3中用到的if else就是條件語(yǔ)句的語(yǔ)句定義符。
(3)預(yù)處理命令字
用于表示一個(gè)預(yù)處理命令。如前面各例中用到的include.
3.運(yùn)算符
C語(yǔ)言中含有相當(dāng)豐富的運(yùn)算符。運(yùn)算符與變量,函數(shù)一起組成表達(dá)式,表示各種運(yùn)算功能。運(yùn)算符由一個(gè)或多個(gè)字符組成。
4.分隔符
在C語(yǔ)言中采用的分隔符有逗號(hào)和空格兩種。逗號(hào)主要用在類(lèi)型說(shuō)明和函數(shù)參數(shù)表中,分隔各個(gè)變量?崭穸嘤糜谡Z(yǔ)句各單詞之間,作間隔符。在關(guān)鍵字,標(biāo)識(shí)符之間必須要有一個(gè)以上的空格符作間隔,否則將會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤,例如把int a;寫(xiě)成 inta;C編譯器會(huì)把inta當(dāng)成一個(gè)標(biāo)識(shí)符處理,其結(jié)果必然出錯(cuò)。
5.常量
C 語(yǔ)言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號(hào)常量、轉(zhuǎn)義字符等多種。在第二章中將專(zhuān)門(mén)給予介紹。
6.注釋符
C 語(yǔ)言的注釋符是以“/*”開(kāi)頭并以“*/”結(jié)尾的串。在“/*”和“*/”之間的即為注釋。程序編譯時(shí),不對(duì)注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來(lái)向用戶(hù)提示或解釋程序的意義。在調(diào)試程序中對(duì)暫不使用的語(yǔ)句也可用注釋符括起來(lái),使翻譯跳過(guò)不作處理,待調(diào)試結(jié)束后再去掉注釋符。
編輯推薦:
權(quán)威預(yù)測(cè):2013年全國(guó)計(jì)算機(jī)等級(jí)考試時(shí)間
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |