按照之前的計劃,這篇文章本該寫C語言簡介,包括一些歷史背景,發展狀況, 語言特點什麼的,這些東西著實比較囉嗦。
吃飯用的筷子,到現在我都不知道它的由來,不知道它是在什麼歷史背景下誕生的
有些東西還是有必要了解一下,比如,C語言所產生的代碼運行速度比彙編語言編寫的代碼運行速度稍慢一點,但還是有得一拼,同時C語言要比彙編語言編寫的代碼可讀性高,可移植性好。另外,相對於其他高級語言,比如C++、java、C#等來說,C語言編寫的代碼運行效率要高。
在介紹C語言的數據類型和基本語法之前,先說說C程序結構和C文件結構。
1、C程序結構:
①預處理指令;
②變量、函數、語句、表達式、註釋等;
③返回值;
以一段簡單的打印輸出“hello world”代碼為例:
注意:一個完整的C語言程序,是由一個、且只能有一個main()函數(又稱主函數)和若干個其他函數結合而成,或僅由一個main()函數構成;
接下來看看C語言程序運行結構:基本的三種程序結構為順序結構、選擇結構和循環結構。
順序結構:程序按順序執行,不發生跳轉。
選擇結構:依據是否滿足條件,執行相應功能。(1)if(表達式) 語句;(2)if(表達式)語句1;else語句2;(3)if(表達式1)語句1;else if(表達式2)語句2;...else語句n;
注意:第三種方式,即: if......else if..........else if.....else,只能響應一個條件。
循環結構:
while ( ) { } 語句 先判斷表達式後執行.
do{ }-while( ) 語句 先執行語句後判斷表達式.
for( ; ; ){ }
2、C文件結構:
一個基於C的軟件系統一般由以下文件構成:
若干個C文件:每個C文件中包含若干個函數。
若干個頭文件:每個頭文件中包含一些數據結構的定義以及C函數、變量的原型聲明。
若干個庫文件:庫文件是編譯後的二進制文件,一般由若干C文件編譯後組成,其中包含了若干個函數的可執行代碼;這些庫文件中的函數可執行代碼在連接的時候合併到最終的可執行文件中。
若干個make文件:make文件描述了多個文件中的依賴關係以及生成最終可執行文件或庫文件所需要的信息。
由於篇幅較小,再加點內容,順便寫寫C語言的關鍵字和控制語句。
1、關鍵字:
這裡介紹下C語言的32個關鍵字(至於ISO推出的C99標準新增的5個C語言關鍵字和C11標準新增了7個C語言關鍵字目前沒有做過過多瞭解,這裡就不再介紹)
(1)數據類型關鍵字(12個)
char,short,int,long,float,double,unsigned,signed,void,struct,union,enum;
char:字符型類型數據
short:短整型數據,修飾int,一般省略被修飾的int;// short int a = 10;一般寫成 int a = 10;
int:整型數據,通常為編譯器指定的機器字長;
long:長整型數據,修飾int,一般省略被修飾的int;
float:單精度浮點型數據;
double:雙精度浮點型數據;
unsigned, signed是修飾符,分別表示無符號和有符號,我們時常寫的“ int a=123;”其實就是“signed int a = 123;”,表示有符號整型
void: 聲明函數無返回值或無參數,修飾指針時表示無類型指針,void不可用來定義變量,但可以用它來修飾各種變量;
struct:用來聲明結構體;
union:用來聲明共用體或者叫聯合體;
enum:用於枚舉類型的聲明;
關於結構體,共用體,枚舉的用法以及結構體和共用體的區別以後單獨再寫;(2)控制語句關鍵字(12個)
if,else,for,do,while,break,case,continue,default,return,switch,goto(儘量別使用);
(3)存儲類關鍵字(4個)
auto,extern,register,static
auto:聲明自動變量(很少使用);
extern:聲明變量外部可用,可以置於變量或者函數前,以表示變量或者函數的定義在別的文件中,可以外部使用;
static:聲明靜態變量,static修飾的變量存儲在靜態變量區,修飾全局變量時,表示該變量為全局靜態變量,作用域為當前文件;修飾函數時表示函數作用域為當前文件內部; 修飾局部變量時,表示該變量為靜態局部變量,只被初始化一次,賦值之後值會保持最新的值,也就是說局部靜態變量的生命週期被擴展到整個程序運行的時間段內。這裡不知道有沒有說清楚,乾脆看個例子簡單明瞭:
register:聲明寄存器變量,修飾符暗示編譯程序相應的變量將被頻繁地使用,如果可能的話,應將其保存在CPU的寄存器中,以加快其存儲速度。
注:register變量必須是能被CPU所接受的類型,這通常意味著register變量必須是一個單個的值,並且長度應該小於或者等於整型的長度。不過,有些機器的寄存器也能存放浮點數。因為register變量可能不存放在內存中,所以不能用“&”來獲取register修飾變量的地址,如:
(4)其他關鍵字(4個)
const,sizeof,typedef,volatile
const:const修飾變量,表示被修飾的變量不可被當前線程或進程改變;例如:const int *p = 100; //const修飾int *,表示*p的值不可變*p = 50; //錯誤,*p的值不可變再比如:int a = 0;int b = 0;int * const p = &a;//const修飾指針p,表示指針變量地址不可變;p = &b; //錯誤,地址不可變,不能指向其他地址;
sizeof:計算數據類型長度或者變量佔內存空間大小,sizeof長得像函數,其實它是個關鍵字;
typedef:為某種數據類型定義一個新的名字;
volatile:確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值,簡單地說就是防止編譯器對代碼進行優化。比如如下程序:num=0x65;num =0x66;num =0x67;num =0x68;對外部硬件而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是編譯器就不能像對待純粹的程序那樣對上述四條語句進行優化,只認為 num=0x65(即忽略前三條語句,只產生一條機器代碼)。如果鍵入volatile,則編譯器會逐一的進行編譯併產生相應的機器代碼(四條)
2、語句
C語言利用函數體中的可執行語句,向計算機系統發出操作指令;按照語句功能或構成的不同,可將C語言的語句分為5類:
(1)控制語句(9條,可以細分為三種):
選擇結構控制語句
if()~else~, switch()~
循環結構控制語句
for()~, while()~, do~while(), break, continue
其他控制語句
return, goto
return功能:終止執行函數,賦值(可選); 將控制權返回給調用函數的下一條語句
goto:無條件轉移語句,跳轉語句;
如上代碼,在不使用goto的情況下,會分別打印出line 1、line 2、line3,在打印完line 1後使用goto語句,則直接跳轉到goto目標代碼,即代碼中的end部分;
(2)函數調用語句:
函數調用語句由一次函數調用加一個分號構成.
例如:
printf(“hello world!”);
scanf(“%d”,&num);
(3)表達式語句:
表達式語句是由表達式後加一個分號構成,
例如:
“num = 10”是表達式,
“num = 10;”是賦值語;
(4)空語句:
空語句由一個分號構成,空語句什麼操作也不執行.。
(5)複合語句:
複合語句由大括號括起來的一組語句構成。
{
{ } //複合語句,注意大括號後不需要分號
}
複合語句一般與其它語句配合使用:
如for( ; ; ) { }
這玩意兒想的時候不多,寫起來卻很多,深究起來就多的完全說不完(┬_┬),C語言基礎部分本應該在本篇文章中寫完,由於時間問題,下次再寫吧。
下篇開始說說數據類型,運算符與表達式,想了解的小夥伴們,可以關注收藏,後續內容請見下回分解。