- 程序設計基礎教程:C語言
- 常東超 劉培勝 郭來德等編著
- 5002字
- 2020-05-07 11:49:28
1.3 C語言簡介
1.3.1 C語言的發展歷史
C語言是當今社會應用廣泛,并受到眾多用戶歡迎的一種計算機高級語言。它既可用來編寫系統軟件,也可用來編寫應用軟件。
早期的系統軟件設計均采用匯編語言,例如大家熟知的UNIX操作系統。盡管匯編語言在可移植性、可維護性和描述問題的效率等方面遠遠不及高級程序設計語言,但是一般的高級語言有時難以實現匯編語言的某些功能。那么,能否設計出一種集匯編語言與高級語言的優點于一身的語言呢?這種思路促成了UNIX系統的開發者——美國貝爾實驗室的Ken Thompson在1970年設計出了既簡單又便于硬件操作的B語言,并用B語言寫了第一個在PDP-7上實現的UNIX操作系統。
以歷史發展的角度看,C語言起源于1968年發表的CPL語言(Combined Programming Language),它的許多重要思想來自于Martin Richards在1969年開發的BCPL語言,以及以 BCPL 語言為基礎的B語言。Dennis M.Ritchie在B語言的基礎上,于1972年開發了C語言,并用C語言寫成了第一個在PDP-11計算機上實現的UNIX操作系統(主要在貝爾實驗室內部使用)。以后,C語言又經過多次改進,直到1975年用C語言編寫的UNIX操作系統第6版公諸于世后,C語言才舉世矚目。1977年出現了獨立于機器的C語言編譯文本《可移植C語言編譯程序》,從而大大簡化了把C語言編譯程序移植到新環境所需做的工作,這本身也就使UNIX操作系統迅速地在眾多的機器上實現。例如VAX、AT&T等計算機系統都相繼開發了UNIX。隨著UNIX的使用日益廣泛,C語言也迅速得到推廣。1978年以后,C語言先后移植到大、中、小、微型計算機上,它的應用領域已不再限于系統軟件的開發,而成為當今最流行的程序設計語言之一。
以1978年發布的UNIX第7版的C語言編譯程序為基礎,Brian W.Kernighan和Dennis M.Ritchie合著了影響深遠的名著《C程序設計語言》(The C Programming Language),這本書中介紹的C語言成為后來廣泛使用的C語言版本的基礎,它被稱為標準C。
1983年美國國家標準化協會(ANSI)根據C語言問世以來的各種版本,對C語言的發展和擴充制定了新的標準,稱為ANSI C。1987年ANSI又公布了新標準,稱為87 ANSI C。
目前流行的C語言編譯系統大多是以ANSI C為基礎進行開發的,不同版本的C編譯系統所實現的語言功能和語法規則基本部分是相同的,但在有關規定上又略有差異。本書的敘述基本上以ANSI C為基礎。
1.3.2 C語言的特點
C語言是一種通用的程序設計語言。C語言的通用性和無限制性使得它對于程序設計者來說都顯得更加通俗、更加有效。目前,C語言程序設計已應用于各個領域,無論是設計系統軟件(操作系統、編譯系統)或應用軟件(圖形處理),還是用于數據處理(如企業管理)或數值計算等方面都可以很方便地使用C語言。
C語言與其他高級語言相比具有以下特點:
①C語言具有結構語言的特點,程序之間很容易實現段的共享。它具有結構化的流程控制語句(如if…else語句,switch語句,while語句,do-while語句,for語句),支持若干種循環結構,允許編程者采用縮進書寫形式編程。因此,用C語言設計出的程序層次結構清晰。
②C語言的主要結構成分為函數,函數可以在程序中被定義完成獨立的任務,獨立地編譯成代碼,以實現程序的模塊化。
③C語言運算符豐富,運算符包含的范圍很廣泛。C語言把賦值、括號、強制類型轉換都當作運算符處理。靈活地使用各種運算符可以實現在其他的高級語言中難以實現的運算。
④C語言數據類型豐富。數據類型有整型、實型、字符型、數組型、指針型、結構體型、共用體型等,能用來實現各種復雜的數據結構(如鏈表、樹、棧等)的運算。尤其是C語言的指針型數據的運算,更是靈活、多樣。
⑤C語言允許直接訪問物理地址,即可直接對硬件進行操作,實現匯編語言的大部分功能。C語言這一特點,使得它成為編制系統軟件的基本語言(UNIX的絕大部分就是由C語言寫成的)。
⑥C語言語法限制不太嚴格,程序設計自由度大。這樣使C語言能夠減少對程序員的束縛?!跋拗啤迸c“靈活”是一對矛盾。限制嚴格,就易失去靈活性;而強調靈活,就必然放松限制。從這個角度來看,使用C語言編程,要求編程者對程序設計技巧要更加熟練一些。
⑦用C語言編程,生成的目標代碼質量高,程序執行效率高。同時用C語言寫的程序可移植性好。
⑧C語言很容易被其他領域接受。單片機領域首選C語言作為開發工具,嵌入式系統和數字信號處理(Digital Signal Processing,DSP)領域也將C語言作為自己的開發工具。
C語言優點很多,但是它也存在一些缺點,如運算優先級太多,不便記憶;數值運算能力方面不像其他高級語言那樣強,語法限制不嚴格等。盡管C語言目前還存在一些不足之處,但由于它目標代碼質量高、使用靈活、數據類型豐富、可移植性好而得到廣泛的普及和迅速的發展,成為一種深受廣大用戶歡迎的程序設計語言,同時也是一種在系統軟件開發、科學計算、自動控制等各個領域被廣泛應用的程序設計語言。
1.3.3 C語言程序的基本結構及書寫規則
(1)C語言程序的基本結構
在學習C語言的具體語法之前,我們先通過一個簡單的C語言程序示例,初步了解C語言程序的基本結構。
【例1.1】 編寫程序,輸出文字:Hello C!
#include <stdio.h>
main()
{
printf("Hello C!\n");
}
運行這個程序時,在屏幕上顯示一行英文:
Hello C!
這是一個僅由main函數構成的C語言程序。main是函數名,C語言規定必須用main作為主函數名,函數名后面一對圓括號內是寫函數參數的,本程序的main函數沒有參數,故圓括號中間是空的,但圓括號不能省略。程序中的main()是主函數的起始行,一個C程序總是從主函數開始執行。每一個可執行的C程序都必須有且僅有一個主函數,但可以包含任意多個不同名的函數。main()后面被大括號{ }括起來的部分稱為函數體。一般情況下,函數體由“說明部分”和“執行部分”組成。本例中只有執行部分而無說明部分。執行部分由若干語句組成。“\n”是換行符,即在輸出“Hello C!”后回車換行。
程序中的“#include <stdio.h>”通常稱為命令行,命令行必須用“#”號開頭,行尾不能加“; ”號,它不是C程序中的語句。一對括號“<”和“>”之間的stdio.h是系統提供的頭文件,該文件包含著有關輸入輸出函數的說明信息。在程序中調用不同的標準函數,應當包含相應的文件,以使程序含有所調用標準庫函數的說明信息。至于應該調用哪個文件,將在以后的章節中陸續介紹。
【例1.2】 已知兩個整型數8和12,按公式s=ab計算矩形的面積,并顯示結果。
#include <stdio.h> /*標準輸入輸出頭文件*/
void main()
{
int a,b,s; /*定義三個整型變量*/
a=8;b=12; /*將兩整數值分別賦給兩邊長a和b*/
s=a*b; /*計算面積并存儲到變量s中*/
printf("a=%d,b=%d,s=%d\n",a,b,s); /*輸出矩形的兩邊長和面積*/
}
執行以上程序的輸出結果如下:
a=8,b=12,s=96
此例題函數體內由定義(說明)部分、執行語句部分兩部分組成,程序中的“int a,b,s;”為程序的定義部分;從“a=8;”到“printf("a=%d,b=%d,s=%d\n",a,b,s);”是程序的執行部分。執行部分的語句稱為可執行語句,必須放在定義部分之后,語句的數量不限,程序中由這些語句向計算機系統發出操作指令。
定義語句用分號“; ”結束。在以上程序中只有一個定義語句,該語句對程序中所用到的變量a、b、s進行定義,說明它們為int類型的變量。程序中“a=8;”和“b=12;”的作用是分別給矩形的兩條邊賦值,“s=a*b; ”的作用是計算出矩形面積并賦給變量s,“printf("a=%d,b=%d,s=%d\n",a,b,s);”的作用是按格式把a、b和s的值輸出到屏幕。C程序中的每一條執行語句都必須用分號“; ”結束,分號是C語句的一部分,并不是語句之間的分隔符。
在編寫程序時可以在程序中加入注釋,用來說明變量的含義、語句的作用和程序段的功能,從而幫助人們閱讀和理解程序。因此一個好的程序應該有詳細的注釋。在添加注釋時,注釋內容必須放在符號“/*”和“*/”之間。“/*”和“*/”必須成對出現,“/”與“*”之間不可以有空格。注釋可以用英文,也可以用中文,可以出現在程序中任意合適的地方。注釋部分只是用于閱讀,對程序的運行不起作用。按語法規定,在注釋之間不可以再嵌套“/*”和“*/”,比如:/*/*……*/*/這種形式是非法的。注意:注釋從“/*”開始到最近的一個“*/”結束,其間的任何內容都被編譯程序忽略。
【例1.3】 求兩個整數中的大數。
#include"stdio.h"
int sum(int x,int y)
{
int s2;
s2=x+y;
return s2;
}
main()
{
int num1,num2,s1;
scanf("%d,%d",&num1,&num2);
s1=sum(num1,num2);
printf("sum=%d\n",s1);
}
運行這個程序時,輸入3,5↙ (輸入3和5給num1,num2)
在屏幕上顯示:
sum=8
本程序是由main函數和一個被調用的函數sum構成的。sum函數的作用是返回num1和num2的和,通過return語句將num1和num2的和s2返回給主調函數main中的變量s1。返回值是通過函數名sum帶回到main函數的調用處。main函數中第3行為調用sum函數,在調用時將實際參數num1、num2的值分別傳送給sum函數中的形式參數x、y。經過執行sum函數得到一個返回值,然后輸出這個值。printf函數中雙引號內“sum=%d\n”在輸出時,其中“%d”將由sum的返回值代替,“sum=”原樣輸出。
(2)書寫程序時應遵循的規則
從書寫清晰,便于閱讀、理解、維護的角度出發,在書寫程序時應遵循以下規則:
①一個說明或一個語句占一行。
②用{} 括起來的部分,通常表示了程序的某一層次結構。{}一般與該結構語句的第一個字母對齊,并單獨占一行。
③低一層次的語句或說明可比高一層次的語句或說明縮進若干格后書寫,以便看起來更加清晰,增加程序的可讀性。
在編程時應力求遵循這些規則,以養成良好的編程風格。
1.3.4 C語言的基本標識符
(1)C語言的字符集
字符是組成語言的最基本的元素。C語言字符集由字母、數字、空白符、標點和特殊字符組成。在字符常量、字符串常量和注釋中還可以使用漢字或其他可表示的圖形符號。
①字母。大小寫英文字母共52個。
②數字。0~9共10個。
③空白符??崭穹?、制表符、換行符等統稱為空白符??瞻追辉谧址A亢妥址A恐衅鹱饔茫谄渌胤匠霈F時,只起間隔作用,編譯程序對它們忽略不計。因此在程序中使用空白符與否,對程序的編譯不發生影響,但在程序中適當的地方使用空白符將提高程序的清晰度和可讀性。
④標點和特殊字符。
(2)標識符的命名規則
在C語言中,有許多符號的命名,如變量名、函數名、數組名等,都必須遵守一定的規則,按此規則命名的符號稱為標識符。合法標識符的命名規則是:標識符可以由字母、數字和下劃線組成,并且第一個字符必須是字母或下劃線。在C語言程序中,凡是要求標識符的地方都必須按此規則命名。以下都是合法的標識符:
month,day,_pi,x1,YEAR,li_lei
以下都是非法的標識符:
¥100,123.5,li-lei,x>y
在C語言的標識符中,大寫字母和小寫字母被認為是兩個不同的字符,例如year和Year是兩個不同的標識符。
對于標識符的長度(指一個標識符允許的字符個數)在C語言中是有規定的,規定是標識符的前若干個字符有效,超過的字符將不被識別。不同的C語言編譯系統所規定的標識符有效長度可能會不同。有的系統允許取8個字符,有的系統允許取32個字符。因此,在寫程序時應了解所用系統對標識符長度的規定。為了程序的可移植性以及閱讀程序的方便,建議變量名的長度最好不要超過8個字符。
(3)標識符的分類
C語言的標識符可以分為以下三類。
①關鍵字 C語言已經預先規定了一批標識符,它們在程序中都代表著固定的含義,不能另作他用,這些標識符稱為關鍵字。關鍵字不能作為變量或函數名來使用,用戶只能根據系統的規定使用它們。根據ANSI標準,C語言可使用以下32個關鍵字:
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
②預定義標識符 所謂預定義標識符是指在C語言中預先定義并具有特定含義的標識符,如C語言提供的庫函數的名字(如printf)和編譯預處理命令(如define)等。C語言允許把這類標識符重新定義另作他用,但這將使這些標識符失去預先定義的原意。鑒于目前各種計算機系統的C語言都一致把這類標識符作為固定的庫函數名或預編譯處理中的專門命令使用,因此為了避免誤解,建議用戶不要把這些預定義標識符另作他用。
③用戶標識符 由用戶根據需要定義的標識符稱為用戶標識符,又稱自定義標識符。用戶標識符一般用來給變量、函數、數組等命名。程序中使用的用戶標識符除要遵守標識符的命名規則外,還應注意做到“見名知義”,即選擇具有一定含義的英文單詞(或其縮寫)作標識符,如day、month、year、total、sum等,為了增加程序的可讀性,一般不要用代數符號,如a、b、c、x、y等做標識符(簡單數值計算程序例外)。
如果用戶標識符與關鍵字相同,則在對程序進行編譯時系統將給出錯信息;如果用戶標識符與預定義標識符相同,系統并不報錯,只是該預定義標識符將失去原有含義,代之以用戶確認的含義,這樣有可能會引發一些不必要的錯誤。
- Java程序設計與開發
- Learn Type:Driven Development
- C++面向對象程序設計(微課版)
- HoloLens Beginner's Guide
- 我的第一本算法書
- 機械工程師Python編程:入門、實戰與進階
- INSTANT OpenNMS Starter
- Python深度學習:基于TensorFlow
- Unity 2017 Mobile Game Development
- 動手學數據結構與算法
- Java網絡編程實戰
- Apache Camel Developer's Cookbook
- Java圖像處理:基于OpenCV與JVM
- C# 7.1 and .NET Core 2.0:Modern Cross-Platform Development(Third Edition)
- Getting Started with hapi.js