Turbo C语言概述课件_第1页
Turbo C语言概述课件_第2页
Turbo C语言概述课件_第3页
Turbo C语言概述课件_第4页
Turbo C语言概述课件_第5页
已阅读5页,还剩603页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TurboC語言概述§1.1C語言的產生與發展C語言是1972年由美國的DennisRitchie設計發明的,並首次在UNIX操作系統的DECPDP-11電腦上使用。發展演變過程:1960年ALGOL60(面向對象的高級語言,離硬體較遠,不易編寫系統程式)→1963年CPL(較ALGOL接近硬體,規模較大,難以實現)→1967年BCPL(對CPL簡化形成)

→1970年B(對CPL簡化形成,簡單且接近硬體)

→1972年C.

隨著微機的日益普及,出現了許多C語言版本。美國國家標準研究所(ANSI)為C語言制定了一套ANSI標準,成為現行的C語言標準。§1.2C語言的特點

C語言發展如此迅速,而且成為最受歡迎的語言之一,主要因為它具有強大的功能。歸納起來C語言具有下列特點:

C是中級語言C是結構化語言

C語言功能強大

C語言可移植性好C語言使用靈活

C是中級語言

它把高級語言的基本結構和語句與低級語言的實用性結合起來。C語言可以象組合語言一樣對硬體端口和物理地址的位、位元組和地址進行操作,而這三者是電腦最基本的工作單元。返回

C是結構化語言

結構式語言的顯著特點是代碼及數據的分隔化,即程式的各個部分除了必要的資訊交流外彼此獨立。這種結構化方式可使程式層次清晰,便於使用、維護以及調試。C語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種迴圈、條件語句控制程式流向,從而使程式完全結構化。返回

C語言功能強大

C語言支持多達34種運算符和多種數據類型,並引入了指針概念,可使程式的編制效率更高。另外C語言也具有強大的圖形功能,支持多種顯示器和驅動器。而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的。返回

C語言可移植性好

C語言還有一個突出的優點就是適合於多種操作系統,如DOS、UNIX,也適用於多種機型。基本上不作任何修改就可以在各種型號的電腦和操作系統上使用。返回

C語言使用靈活

C語言書寫簡潔、緊湊,使用靈活方便,語法的限制較其他語言寬鬆,程式設計時的自由度大。生成的目標代碼品質高執行效率高。返回§1.3簡單的C程式概述

本節首先介紹C程式的基本組成部分;

然後分析TurboC的有關特徵。通過本節的學習,可以對C語言程式有一個初步認識。1.3.1.TurboC程式的一般組成部分

TurboC2.0象其他語言一樣按其規定的格式和提供的語句由用戶編寫應用程式。請看下麵一段TurboC根源程式。

【例1】

/*Exampleprogram1ofTurboC*/main()/*主函數定義*/

{/*函數體{}*/

printf(“Thisisacprogram.\n”);}

【例2】

/*Example2:thesumofNo.aaddNo.b*/main()/*主函數定義*/

{

inta,b,sum;/*定義變數*/a=123;b=456;sum=a+b;

printf(“thesumis%d”,sum);}

【例3】

/*Example3:函數調用*/main()/*主函數定義*/{inta,b,c;/*聲明部分,定義變數*/

scanf(“%d,%d”,&a,&b);c=max(a,b);/*函數調用*/

printf(“max=%d”,c);}

intmax(intx,inty)/*定義max函數,值、形參x,y均為int型*/{intz;/*聲明部分,定義本函數中變數z*/if(x>y)z=x;elsez=y;return(z);/*返回調用函數據*/}TurboC根源程式基本結構組成:C根源程式組成:C根源程式由函數組成一個C程式可由若干個函數組成:有且只有一個主函數main函數和多個子函數,每個函數完成一定功能。函數是C程式的基本單位。被調用函數可以是系統提供的庫函數(如:scanf,printf),也可是用戶編制的函數。C是函數式的語言,編寫C程式就是編寫一個個函數。容易實現程式的模組化;函數組成:函數的首部和函數體

①函數首部:函數類型函數名函數屬性函數參數(形參)名參數類型如:max函數首部:intmax(intx,inty)

說明:函數名後必須跟一對(),形參可無。

②函數體:最外層一對{…}內的部分。函數體包括:

聲明部分:定義所用到的變數執行部分:由若干語句組成說明:函數可無聲明部分,或即無聲明部分又無執行部分

如:dump(){}/*dump為空函數,又稱啞函數*/C程式執行:總是從main函數執行,不論main函數在程式中位置如何;C程式書寫格式:一般用小寫字母書寫;語句數據定義結尾必須要用“;”作為終止符;

C語言無輸入輸出語句,輸入輸出操作由輸入輸出庫函數scanf.printg等實現;注釋部分包含在“/*……*/”之間,在編譯時它被TurboC編譯器忽略。說明:1.TurboC的變數在使用之前必須先定義其數據類型,未經定義的變數不能使用。2.在TurboC中,大、小寫字母是有區別的3.TurboC程式的書寫格式非常靈活,沒有嚴格限制。例如:

main(){charc;clrscr();gotoxy(12,3);puts("WelcometouseTurboC2.0!");gotoxy(15,13);

printf("<CR>--Continue");gotoxy(15,15);...}

這樣寫語法上沒有錯誤,但閱讀起來不方便,同時也使得程式層次不明確。建議在使用TurboC編程時,一行只寫一條語句,遇到嵌套語句向後縮進,必要時對程式加上注釋行。這樣可以使程式結構清楚、易於閱讀、維護和修改。通過以上介紹,得出TurboC根源程式的一般形式為:

main(){

局部變數定義

<程式體>}

sub1(){局部變數定義

<程式體>}……

subN(){

局部變數定義

<程式體>}其中sub1(),...,subN()代表用戶定義的子函數,程式體指TurboC2.0提供的任何庫函數調用語句、控制流程語句或其他用子函數調用語句等。第二章演算法程式應包括兩方面內容:

⑴對數據的描述:指定數據的類型和數據 組織形式,即數據結構

⑵對操作的描述:操作步驟,即演算法

沃爾思提出:程式=演算法+數據結構+程式設計方法+語言工具和環境

演算法:是靈魂數據結構:加工對象語言:工具演算法:解決“做什麼”“怎麼做”程式中的操作語句是演算法的實現§2.1演算法的概念演算法:為解決一個問題而採取的方法和步驟.電腦演算法分類:

數值運算法:目的是求數值解非數值運算法:常用於事務管理領域§2.2簡單演算法舉例例2.1求1*2*3*4*5⑴原始演算法:s1:1*2;s2:2*3s3:6*4;s4:24*5結束⑵迴圈演算法:設變數p代表被乘數,i代表乘數,將每一步驟的乘積放在p中.

s1:p=1;s2:i=2;

s3:p*i→p;s4:i+1→i;s5:若i≤5,返回s3→s5

若I>5,則P=5!結束

迴圈條件:i≤5例2.2有50個學生,要將他們之中成績在80分以上者列印出來.變數:n:學生學號ni:第i個學生學號

g:學生成績gi:第i個學生成績演算法:s1:1→i;/*i控制序號*/s2:gi≥80,列印:

ni,gi;否則:不列印

s3:i+1→i;s4:i≤50,返回s2

i≥50,

結束.例2.3判斷2000-2500年中的每一年是否為閏年

閏年條件:①能被4整除,但不能被100整除如:1996

或②能被100整除,又能被400整除如:2000

演算法:設Y為年份

s1:2000→y;s2:判斷:若y不能被4整除,則輸出y“不是閏年”,

轉至s6,取下一年判斷;

s3:判斷:若y能被4整除,不能被100整除則輸出y“是閏年”,轉至s6;s4:判斷:若y能被100整除,又能被400整除

則輸出y“是閏年”,否則輸出y“不是閏年”.轉至s6;s5:其他情況:輸出y“不是閏年”;

s6:y+1→ys7:當y≤2500時,轉s2繼續,

當y>2500時,結束.例2.4求1-1/2+1/3-1/4+…+1/99-1/100分析:本題為求累加和.每項變化規律:符號正負相間,分母從1—100變數設置:sign:數值符號,sum:累加和,deno:分母,term:某一項.S1:sign=1/*預設符號1*/

s2:sum=1/*第一項放入sum中*/

s3:deno=2 /*分母值預置為2*/

s4:sign=(-1)*sign /*第i+1項sign值*/

s5:term=sign*(1/deno) /*求級數中某項值*/

s6:sum=sum+term /*將本項加入累加器*/

s7:deno=deno+1 /*分母按規律遞減*/

s8:判斷:deno

≤100返回s4

deno>100結束.例2.5對一個大於或等於3的正數,判斷它是否為素數S1:輸入n值

s2:i=2 /*i為除數*/s3:n/i得餘數rs4:判斷:r=0,n能被i數整除,結論:n不是素數,結束.

r≠0,n不能被i數整除,繼續

s5:i+1→is6:當i≤

n-1(或i≤

n/2,

i≤

sqrt(n))時,轉s3繼續,

當i=n時:所有除數比較完畢:結論:n是素數,結束.素數:除1和該數本身外,不能被其他任何數整除的數.n(≥3)是否素數:將n作被除數,用2~(n-1)[或2~n/2,2~sqrt(n)]輪流除n,若都不能整除,則n是素數.§2.2演算法的特點

有窮性:一個演算法應包含有限的操作步驟確定性:演算法中的每一個步驟應當是確定的,應當不被解釋成不同的含義,而應是十分明確無誤的.有零個或多個輸入輸入指執行演算法時需從外界取得的資訊.有零個或多個輸出:“解”既輸出.有效性:指演算法中每一步驟應當有效執行,並得到確定的值.§2.4怎樣表示一個演算法

常用方法:自然語言傳統流程圖 結構化流程圖偽代碼PAD圖等§2.4.1用自然語言表示演算法§2.4.2用流程圖表示演算法

常用流程圖符號起止框

輸入輸出框 判斷框 處理框

或 流程線 連接線 注釋框用流程圖表示演算法舉例例2.6求5!i+1→i結束2→

it*i→t開始1→

ti>5列印tNY例2.7將50名學生中成績在80分以上者的學號和成績列印輸出.流程圖:i+1→i輸入ni,gi1→

i開始i>50ANYi+1→igi≥80A1→

i列印ni,gii>50結束NYNY輸入學生數據判斷並輸出結果例2.8判斷閏年演算法流程圖:y不能被400整除列印y“不是閏年”y不能被4整除NY開始y不能被100整除列印y“是閏年”列印y“不是閏年”列印y“是閏年”y+1→yy>2500開始2000→

tYNNYNY例2.9求1-1/2+1/3-1/4+…+1/99-1/100演算法流程圖流程圖:開始1→

sum2→

deno1→

signAA(-1)*sign→signsign*(1/deno)→termsum+term→sumdeno+1→

denodeno>100結束NY例2.10判斷素數的演算法流程圖流程圖:開始輸入n2→

ir=0?n/i的餘數→ri+1→ii>sqrt(n)?列印n“是素數”列印n“不是素數”結束YNNY§2.4.3三種基本結構⑴順序結構:⑵選擇結構(分支結構)ABab成立不成立PABabPA成立不成立ab⑶

迴圈結構當型迴圈結構直到型迴圈結構P1Aab成立P1ab成立A不成立迴圈結構舉例:列印5個數:1,2,3,4,5當型迴圈實現直到型迴圈實現0→x

X<5X+1→x

列印xNY0→x

X+1→x

列印xX≥5YN三種基本結構的共同特點:只有一個入口只有一個出口結構內的每一個部分都有機會被執行到。對每一個框來說,都應當有一條從入口到出口的路徑通過它。結構內不存在“死迴圈”。P1A無路徑通過A框AB死迴圈§2.4.3用N-S流程圖表示演算法N-S流程圖符號:⑴順序結構⑵選擇結構AB成立P不成立AB⑶當型迴圈結構直到型迴圈結構當P1成立A

直到P1成立說明:A、B框可以是一個簡單操作,也可以是三個基本結構之一。N-S流程圖演算法舉例求5!列印50名學生中成績高於80分的學號、成績1→t2→it*I→ti+1→i直到i>5列印t直到型迴圈1→

i輸入ni,gii+1→i直到>501→

i是gi≥80

否輸出ni,gii+1→I直到I>50選擇結構直到型迴圈結構直到型迴圈結構N-S流程圖演算法舉例判斷閏年2000→

y是

y/4的餘數為0

否是

y/100的餘數不為0

y/400的餘數為0

否“非閏年”“是閏年”“是閏年”“非閏年”

y+1→y

直到y>2500直到型迴圈選擇選擇§2.4.5結構化程式設計方法結構化程式:用高級語言表示的結構化演算法,這種程式便於編寫 、閱讀、維護和修改。結構化程式方法:自頂向下、逐步細化、模組化設計、結構化編程。

自頂向下、逐步細化:先進行總體規劃、再進行各部的設計,是將問題的求解由抽象逐步具體化的過程。模組化設計方法:根據程式模組的功能將它劃分為若干子模組,子模組可以劃分為更小的模組,這個過程採用自頂向下的方法實現。第三章

數據類型、變數和運算符

§1C的數據類型

在TurboC語言中,每個變數在使用之前必須定義其數據類型。TurboC的數據類型:

基本類型:整型(int)、字元型(char)、枚舉類型、實型(浮點型float、double)構造類型:數組、結構(struct)和聯合(共用體union)指針類型(*)空類型(void)§2常量、變數和識別字

1.識別字

識別字:是用於標識變數名、符號常量名、函數名、數組名、類型名和文件名的有效字元序列。識別字組成:由字母、數字或下劃線組成,且第一個字元只能是字母或下劃線。識別字之間的大小寫是被區分的。長度視機型而定,一般為8位。識別字可以分成三類:

保留的關鍵字

由C語言本身使用,共有32個,代表固定意義,由小寫字母組成,且不能用作用戶識別字如變數名、函數名等由ANSI標準定義的共32個

autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoif

whilestatic

預定義識別字

有特殊含義,如庫函數的名字和預處理命令等。系統允許用戶使用,但一般不推薦

用戶識別字

用於命名常量、變數、函數和文件等。其命名原則如下:

1.所有識別字必須由一個字母(a~z,A~Z)或下劃線(_)開頭;2.識別字的其他部分可以用字母、下劃線或數字(0~9)組成;3.大小寫字母表示不同意義,即代表不同的識別字;4.識別字只有前32個字元有效;5.識別字不能使用TurboC2.0的關鍵字。

下麵舉出幾個正確和不正確的識別字:正確smart_decisionkey_boardFLOAT不正確5smartbomb?Key.boardfloat

2.常量和符號常量

常量:在程序运行过程中,其值不能改变的量。

字面常量或直接常量:從字面形式即可判斷的常量。符號常量:用一个标识符代表一个常量,符号常量的值在其作 用域内不能改变或再赋值。常量和符號常量也有各自的數據類型。使用符號常量的長處:⑴含義清楚:定義符號常量時應考慮見名知意⑵便於修改

例:整形常量:12,0,-3

實型常量:4.6,-1.23

字元常量:`a`,`b`例3.1:符號常量的使用

#definePRICE30 main() {intnum,total; num=10; total=num*PRICE; printf(“total=*d”,total); }3.變數

變數:在序運行過程中,其值能夠改變的量稱為變數。一個變數必須有一個變數名,在內存中佔據一定大小的記憶體單元。

3變數名變數值存儲單元a

使用要求:

⑴“先定義,後使用”

⑵每一變數指定為確定類型:便於編譯時為其分配相應的存儲單元以及檢查該變數所行的運算是否法§3整型數據(int)

1.整型常量

整型常量就是整型常數或稱為直接常量。

C的整型常數有三類:

Ⅰ.十進位常數:以非0開始的數,如123,-342

Ⅱ.八進制常數:以0開頭的整型常數是八進制數。 如0123,即(123)8=1x82+2x80=(83)10-011 即(-11)8

Ⅲ.十六進制常數:以0x開頭的整型常數是十六進制數。 如0x123,既是(123)16=1x162+2x161+3x160=(291)10

另外,可在整型常數後添加一個"L"或"l"字母表示該數為長整型數,如22L,0773L,0Xae4l。2.整型變數

1.整型數據在內存中的存放形式

數據在內存中以二進位補數的形式存放。數據所占的記憶體大小與其類型有關,每一基本類型整型變數在內存中占2個位元組。如:inti;i=10;數據存放示意圖i10數據在內存中存放情況0000000000001010i正數補數:同原碼 負數補數:該數絕對值的二進位形式按位取反再加1例:求-10的補數:10的原碼:0000000000001010按位取反:-10的補數:1111111111110101

1111111111110110

2.整型變數的分類

整型數類型:[signed]int,

[unsigned]

int

,

[signed]short[

int],[unsigned]short[

int

],

[signed]long[

int

],[unsigned]long[

int

]

整型變數類型:基本整型int

短整型short

長整型long

修飾符:short

long

signedunsigned(隱含為signed) signed變數存儲單元中最高位為符號位 unsigned變數存儲單元中全部位存放數本身例:inta;最大值0111111111111111=32767符號位最小值1000000000000000=-32768inta;最大值0111111111111111=65535數值位最小值0000000000000000=0ANSI標準定義的整數類型類型位元組比特數最小取值範圍[signed]int216-215~(215-1)[unsigned]int2160~(216-1)[signed]short[

int]216-215~(215-1)[unsigned]short[

int

]2160~(216-1)[signed]long[

int

]432-231~(231-1)[unsigned]long[

int

]4320~(232-1)

某一個類型的數據一旦超出了其表示範圍,就會發生數據溢出,這種錯誤系統的語法檢查不能夠發現3.整型變數定義

C可以用下列語句定義整型變數

inta,b;

/*a、b被定義為有符號短整型變數*/

unsignedlongc;

/*c被定義為無符號長整型變數*/

例3.2main(){inta,b,c,d;/*a,b,c,d為整型變數*/ unsignedu; /*u為無符號整型變數*/

a=12;b=-24;u=10;

c=a+u;d=b+u;

printf(“a+u=%d,b+u=%d\n”,c,d); }4.整型常量的類型

(1)一個整數如果值在int或unsinged

int範圍內,就可以認為是int或unsinged

int型,並且可以賦值給int、long或unsinged

int、unsingedlong型變數。

(2)一個整數如果值在long或unsingedlong範圍內,就可以認為是long或unsingedlong型,並且可以賦值給long或unsingedlong型變數。

(3)常量沒有unsinged無符號類型,但一個正整數可以賦值給unsinged類型變數。§4實型(浮點型float)

1.實型常量的表示方法

指帶有小數部分的數,又稱實數,C語言中的浮點數是以十進位數表示的,採用兩種形式(1)十進位小數形式:由數字和小數點組成(必須有小數點)。

如:(2)指數形式。由一個正整數的指數和一個1~10之間小數的尾數組成。

整數.小數e指數3.141593.2159E62.實型變數

實型數據在內存中的存放形式

實型數據在內存中占4個位元組,共32位. 按指數形式存放:分成小數部分和指數部分分別存放。指數部分採用規格化的指數形式.

如:3.14159:+.314591數符+小數.31459指數101X3.1459其小數部分位數越多則數據的精度越高但表示的範圍越小。其位數一般由編譯系統指定,一般的小數部分位數為24位,指數部分位數為8位,均包括符號位。

實型變數的分類

TurboC中有以下三種類型的浮點數:float字長為4個位元組共32位二進位數,數的範圍是10-37E~10+38E。有效數字6~7位。double字長為8個位元組共64位二進位數,數的範圍是10-307E~10+308E。有效數字15~16位。doublefloat

字長為16個位元組共128位二進位數,數的範圍是10-4931E~10+4932E。有效數字18~19位。

舍入誤差

由於實型變數用一個有限長度的記憶體單元來存儲,其有效數字的位數是有限的,因而會產生誤差。編程時應該避免與一個相比較非常小的數進行算術運算,或採取人為的控制措施。

【例】main() { floata,b; a=123456.789e5; b=a+20;

printf(“%f%f”,a,b); }

運行結果:a,b均為12345678848.000000a,b為float,有效位為6-7位a理論值:12345678900有效位:1234567b理論值12345678920

有效位:12345677位以後的數字無意義的.3.浮點型變數的定義

可以用下列語句定義浮點型變數:

floata,f;

/*a,f被定義為單浮點型變數*/doubleb;

/*b被定義為雙浮點型變數*/說明:1.浮點常數只有一種進制(十進位)。

2.所有浮點常數都被默認為double。

3.浮點數均為有符號浮點數,沒有無符號浮點數。

4.絕對值小於1的浮點數,其小數點前面的零可以省略。如:0.22可寫為.22, -0.0015E-3可寫為-.0015E-3。

5.TurboC默認格式輸出浮點數時,最多只保留小數點後六位。§5字元型(char)1.字元常量字元常量代表ASCII碼字元集裏的一個字元字元的表示方法:圖形符號和轉義字元⑴

'字元的圖形符號':如'a','9','Z','+','A'

圖形符號指可列印字元,但‘,\,不能用此方法.⑵

‘轉義字元’:可表示任何可輸出字元

①轉義序列形式:“\圖形符號”:\n,\t,\b,\r,\f“\ddd”:ddd表示1~3位八進制數字代表的字.“\xhh”:hh表示1~3位八進制數字代表的字元,x為首碼,不能省.

如字元A(65)可表示為:‘A’,’\101’,’\x41’②單引號’.反斜線\字元必須用轉義序列表示.

單引號:’\’’,‘\047’或‘\47’,‘\47’

反斜線:’\\’,’\134’,’\x5c’③空字元:’\0’,’\000’ ASCII碼為空的字元,不是空白字元,它強調字元的類型為字元.表:轉義字元及其作用字元形式含義ASCII碼\n換行10\t水準製錶(到下一tab位置)9\b退格(移到前一列)8\r回車(移到本行開頭)13\f換頁12\\字元\92\’字元’39\”字元”34\ddd1到3位8進制數代表的字元\xhh1到2位16進制數代表的字元【例】main(){

inta,b,c;a=5;b=6;c=7;

printf("%d\n\t%d%d\n%d%d\t\b%d\n",a,b,c,a,b,c);}/*此程式練習轉義字元的使用*/運行結果:5 675672.字元變數的存儲及使用

字元變數在內存中以其存儲字元的ASCII碼的二進位值,存儲成一個位元組的整型數。有符號字元型變數取值範圍為-128~127,無符號字元型變數取值範圍是0~255。如:a1=‘a’,a2=‘b’在內存中存儲形式:(97)(98)97980110000101100010a1a2字元型與整型數據的通用字元型數據也將按整型數處理,如果某個變數定義成char,則表明該變數是有符號的,即它將轉換成有符號的整型數。在程式中一個字元型變數是可以等同為一個整型變數進行運算的,我們可以為字元型變數賦整型值,或將之與整型變數一起運算。C語言允許對整型變數賦以字元值,也允許對字元變數賦以整型值。 在輸出時,允許把字元變數按整型量輸出,輸出格式為%d,也允許把整型量按字元量,輸出輸出格式為%c。 整型量為二位元組量,字元量為單字節量,當整型量按字元型量處理時,只有低八位位元組參與處理。【例】main(){chara,b;a=120;b=121;

printf("%c,%c\n%d,%d\n",a,b,a,b);}顯示程式結果:a,b120,121;

本程式中說明a,b為字元型,但在賦值語句中賦以整型值。從結果看,a,b值的輸出形式取決於printf函數格式串中的格式符,當格式符為"c"時,對應輸出的變數值為字元,當格式符為"d"時,對應輸出的變數值為整數。【例】main(){chara,b;a=‘x';b='y';a=a-32;b=b-32;

printf("%c,%c\n%d,%d\n",a,b,a,b);}運行結果:X Y 88 89

C語言允許字元變數參與數值運算,即用字符的ASCII碼參與運算。由於大小寫字母的ASCII碼相差32,因此運算後把小寫字母換成大寫字母。然後分別以整型和字元型輸出。4.字串常量

字串常量是以一對雙引號括起來的字元序列。 如:“howdoyoudo”,“¥12345”和“a”等。 但沒有對應的字串變數。 特別注意:“a”和‘a’不是同一個常量,前者是字串常量,而後者是字元常量。兩者不同的原因在於每個字串常量的結尾,C語言系統會自動的加上一個特殊字元‘\0’作為字串的結束標誌。因此,字串“a”中包含有兩個字元分別是‘a’和‘\0’。

特別注意:不要將字串常量賦值給字元變數,或對字串常量和字元常量作關係運算。字串的存儲:字串的存儲在內存中存儲時,系統在串尾添加一個’\0’空字元,作為字串結束標誌,即字串的存儲長度比實際長度多1.

例如:字串“china”,記憶體存儲

C

h

ina\0

電腦在編譯時,將留出連續6個字元的空間,前5個存儲5個字母。第6個用來存放字串終止符“\0”,並且終止符無需人為處理。§6變數賦初值

對於程式中要求預先設置初值的變數,C語言允許在變數定義的時候同時使變數初始化。

如:

inta=3;inta,b,c=5;floatf=1.234;charI,j,k=’0234’;

對同一個類型的多個變數賦同一個值時,可寫成:

inta=b=c=1;但不同類型的變數一般不能夠用這種方法:如:

inta;floatb=a=1;變數賦初值1聲明的作用為變數分配記憶體單元,變數名作為記憶體單元的符號地址,這件事是在程式編譯鏈接時完成的。2變數其值可以改變的量通過b可以找到相應的存儲單元地址XXXXb變數名

————變數值存儲單元地址XXXX30.0變數賦初值3對變數的賦值賦值符號“=”<變數>=<運算式>b=30.0; //讀作將運算式的值30.0賦給變數ba=sin(b*3.14159/180); //讀作將運算式(正弦函數)

//的值賦給變數a4變數賦值特點(1)先定義,後使用

intd,e,f; 定義三個變數為整數類型 如未定義,則在編譯時被查出,認為非法(2)變數未被賦值前,值為0(3)對變數賦值過程是“覆蓋”過程,用新值去替換舊值(4)讀出變數的值,該變數保持不變(5)參與運算式運算的所有變數都保持原來的值不變變數賦值過程

def

未賦值前000執行e=d770執行f=d+e7714執行d=77007執行d=d+187141§7不同類型變數間的混合運算

整型、實型和字元型數據之間可以進行混合運算,運算時,不同類型的數據要先轉換成同一類型,運算結果的類型按照類型轉換的原則進行。變數的數據類型是可以轉換的。自動轉換強制轉換轉換的方法:1.自動類型轉換

自動轉換發生在不同數據類型的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則:

若參與運算量的類型不同,則先轉換成同一類型,然後進行運算。

轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。

所有的浮點運算都是以雙精度進行的,即使僅含float單精確度量運算的運算式,也要先轉換成double型,再作運算。char型和short型參與運算時,必須先轉換成int型。

在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度比左邊量長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四捨五入向前舍入。數據類型轉換規則圖:說明:①橫向向左的箭頭表示必定的轉換②縱向箭頭表示不同類型轉換方向③類型轉換由系統自動進行longunsignintdoubl高低floatcharshort(級別)類型轉換及運算次序舉例:

已知:inti;floatf;doubled;longe;則:10+‘a’+i*f-d/e①10+‘a’+i*f-d/e/*’a’

int,ASCII為97*/②107+i*f-d/e

/*f

→double,必定轉換*/

/*i

→double,

i*f

為double*/③107+(i*f)-d/e

/*107

→double

*/

④[107+(i*f)]-d/e

/*e

→double*/

d/e

→double

*/⑤

[107+(i*f)]-d/e

/*[107+(i*f)]

→double,

結果:double

*/【例】main(){floatPI=3.14159;

ints,r=5;s=r*r*PI;

printf("s=%d\n",s);}本例程式中,PI為實型;s,r為整型。在執行s=r*r*PI語句時,r和PI都轉換成double型計算,結果也為double型。但由於s為整型,故賦值結果仍為整型,舍去了小數部分。2.強制類型轉換

強制類型轉換是通過類型轉換運算來實現的。其一般形式為:(類型說明符)(運算式)

其功能是把運算式的運算結果強制轉換成類型說明符所表示的類型。例如:(float)a

把a轉換為實型(int)(x+y)把x+y的結果轉換為整型

在使用強制轉換時應注意以下問題:類型說明符和運算式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行的臨時性轉換,而不改變數據說明時對該變數定義的類型。【例】main(){floatf=5.75;

printf("(int)f=%d,f=%f\n",(int)f,f);}本例表明,f雖強制轉為int型,但只在運算中起作用,是臨時的,而f本身的類型並不改變。因此,(int)f的值為5(刪去了小數)而f的值仍為5.75。運行結果:(int)f=5f=5.75§8算術運算符與算術運算式

TurboC的運算符非常豐富,主要分為三大類:算術運算符,關係運算符與邏輯運算符,按位運算符。除此之外,還有一些用於完成特殊任務的運算符。下麵分別進行介紹。TurboC的算術運算符如下:

操作符

作用

+加,一目取正-減,一目取負*乘/除%取模(取餘)--減1++加11.一目和二目操作

一目操作是指對一個運算元進行操作。例如:-a是對a進行一目負操作。

二目操作(或多目操作)是指兩個運算元(或多個運算元)進行操作。

/與%的用法:/若兩運算元為整數,則結果為整型。否則,執行實數除,結果為double。

例:15/3=33/6=0–8/5=-115.0/3=15/3.0=15.0/3/0=5.0L%兩運算元必須為整數,結果符號同左運算元。不能用於浮點數例:17%5=2或17%-5=2

5/10=5

-17%5=-210/2=0/與%的關係:a%b=a-a/b*b(a,b為整數)

例:17%5=17-17/5*5=17-3*5=2

另外,由於TurboC中字元型數會自動地轉換成整型數,因此字元型數也可以參加二目運算。【例】

main(){charm,n;m='c';n=m+'A'-'a';...}

/*定義字元型變數*//*給m賦小寫字母'c'*//*將c中的小寫字母變成大寫字母'B'後賦給n*/

上例中m=‘c’即m=98,字母A和a的ASCII碼值分別為65和97。這樣可以將小寫字母變成大寫字母,反之,如果要將大寫字母變成小寫字母,則用c+'a'-'A'進行計算

2算術運算式和運算符的優先順序C算術運算式:用算術符和括弧將運算對象(也稱運算元,包括常量、變數、函數等到連接起來的,符合C語法規則的式子。如:a*b/c-(1.5+’a’)注意事項:⑴左右括弧必須配對,運算時稱計算內括弧運算式的值,再計算外層括弧內運算式。⑵雙目運算符兩側運算元類型必須一致,若不一致系統將自動按照規則對運算元類型轉換,再進行相應操作。運算符優先順序:先按運算符優先順序別高低次序執行(見P375附錄Ⅲ)()、-(負)、*、/、%、+、-運算結合方向:若一個運算對象兩側運算符的運算符優先順序別相同,則按結合方向處理。左結合性(自左至右、左結合):運算對象先與左面的運算符結合。右結合性:運算對象先與右面的運算符結合。例:a-b*c//“*”優先於“-”

a-b+c//“-”與“+”同級,按左結合規則2.自增、自減運算

在TurboC中有兩個很有用的運算符,在其他高級語言中通常沒有。這兩個運算符就是自增"++"和自減"--"運算符和,運算符"++"是運算元加1,而"--"則是運算元減1

例如:x=x+1可寫成x++,或++xx=x-1可寫成x--,或--xx++(x--)與++x(--x)在上例中沒有什麼區別,但x=m++和x=++m卻有很大差別。

x=m++表示將m的值賦給x後,m加1。

x=++m表示m先加1後,再將新值賦給x。

首碼式或尾碼式自增運算符自增、自減運算符均為單目運算,都具有右結合性。“++”或“--”可以出現在運算元前面首碼式:++i,--i:先將運算元增(減)1,後取運算元的新值作為運算式的結果.尾碼式:i++,i--:將運算元增(減)之前的值作為運算式的結果,運算元的增(減)1運算是在引用運算式的值之後完成的.說明:

a.“++”和“--”只能用於變數,不能用於常量或運算式

b.“++”和“--”結合方向為“右結合”【例】main(){

inti=8;

printf("%d\n",++i);

printf("%d\n",--i);

printf("%d\n",i++);

printf("%d\n",i--);

printf("%d\n",-i++);

printf("%d\n",-i--);}

/*i的初值為8*//*i先加1後輸出:9*//*i先減1後輸出:8*//*先輸出i:8之後i再加1(為9)*//*先輸出i:9之後i再減1(為8)*//*先輸出i:-8之後i再加1(為9)*//*先輸出i:-9之後i再減1(為8)*/【例】main(){

inti=5,j=5,p,q;p=(i++)+(i++)+(i++);q=(++j)+(++j)+(++j);

printf("%d,%d,%d,%d",p,q,i,j);}對P=(i++)+(i++)+(i++)應理解為:三個i相加,故P值為15。然後i再自增1三次相當於加3故i的最後值為8。對q=(++j)+(++j)+(++j)應理解為:j先自增1,再參與運算,由於j自增1三次後值為8,三個8相加的和為24,j的最後值仍為8。語句中p=(i++)+(i++)+(i++)和p=i+++i+++i++等價,q=++j+++j+++j與q=((++(j++)+j++)+j等價

main(){intx=0,y=1;

printf(“x=%d,y=%d\n”,x,y);

printf(“x++=%d\n”,x++);

printf(“y--=%d\n”,y--);

printf(“x=%d,y=%d\n”,x,y);}結果輸出:x=0,y=1 x++=0

y--=1

x=1,y=0§9賦值運算符與賦值運算式

1.賦值運算符

“=”由“=”連接的式子稱為賦值運算式。

其一般形式為:變數=運算式

例如:

x=a+bw=sin(a)+sin(b)y=i+++--j

賦值運算式的功能是計算運算式的值再賦予左邊的變數。賦值運算符具有右結合性。因此a=b=c=5

可理解為a=(b=(c=5))

在C中凡是運算式可以出現的地方均可出現賦值運算式。例如,式子x=(a=5)+(b=8)是合法的。它的意義是把5賦予a,8賦予b,再把a,b相加,和賦予x,故x應等於13。在C語言中也可以組成賦值語句,按照C語言規定,任何運算式在其未尾加上分號就構成為語句。因此如x=8;a=b=c=5;都是賦值語句,在前面各例中我們已大量使用過了。2.賦值語句中的數據類型轉換

類型轉換是指不同類型的變數混用時的類型改變。如果賦值運算符兩邊的數據類型不相同,系統將自動進行類型轉換,即把賦值號右邊的類型換成左邊的類型。在賦值語句中,類型轉換規則是:等號右邊的值轉換為等號左邊變數所屬的類型。具體規定如下:

實型賦予整型:舍去小數部分。

整型賦予實型:數值不變,但將以浮點形式存放,即增加小數部分(小數部分的值為0)。

字元型賦予整型:由於字元型為一個位元組,而整型為二個位元組,故將字元的ASCII碼值放到整型量的低八位中,高八位為0。

整型賦予字元型:只把低八位賦予字元量。

總原則:按存儲單元中存儲形式直接傳送。

賦值轉換左右轉換說明例intfloat,doubl捨棄實數的小數部分inti;i=2.56;則I為2intcharint變數低8位取char數據8位;int變數高8位:若將字元處理為unsigned,高8位補0;若將字元處理為signed,高8位同字元最高位,即符號擴展。intlong只long中低16位送int,inta;longb=8;a=b;11111110X=‘\376’0000000011111110i1111111111111110i000000000000000000000000000010000000000000001000左右轉換說明例float,doubleint將整型轉換為實型floatf;doubled;f=23;則為23.00000d=23;則為23.00000000000000floatdouble截取前7位有效數(但不能溢出)floatf;doubled=123.456789e100;f=d;溢出錯誤doublefloat數據不變,有效位擴到16位(記憶體中以64bit存儲)charintshortlong取低8位inti=289;charc=‘a’;c=I;longintint

送long低16位,long低16位為符號擴展longintunsignedint不需符號擴展,高位補0.000000010010000100100001iC=33左右轉換說明例signedIntlongshortunsignedunsignedIntunsignedlongunsignedshort將unsigned內容原樣賦值(若數據超過範圍,則出現錯誤數據)unsignedinta=65535;intb;b=a;11111111111111111111111111111111【例】voidmain(){

inta,b=322;floatx,y=8.88;charc1='k',c2;a=y;x=b;a=c1;c2=b;printf("%d,%f,%d,%c",a,x,a,c2);}

本例表明賦值運算中類型轉換規則。實型量y值8.88後取整數8後賦予a。整型量b值322後增加小數部分後賦予x。字元型量c1轉換為為整型後賦予a;整型量b取其低八位為字元型後賦予c2;(b的低八位為01000010,即十進位66,按ASCII碼對應於字元B)。作除法運算時應特別注意數據類型轉換規則。【例】

main(){floatf;

inti=15;f=i/2;}

上面程式經運行後,f=7並不等於準確值7.5。main(){floatf;

inti=15;f=i/2.0;}正確的為也可直接將i定義為浮點數。3.複合賦值符及運算式

在賦值符“=”之前加上其他二目運算符可構成複合賦值符。如+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。

構成複合賦值運算式的一般形式為:變數雙目運算符=運算式

它等效於:

變數=變數運算符運算式

例如:a+=5等價於a=a+5x*=y+7等價於x=x*(y+7)r%=p等價於r=r%p4.賦值運算式賦值運算式:由賦值運算符將一個變數和一個運算式連接起來的式子.形式:<變數><賦值運算符><運算式>

<賦值運算符>可為複合賦值運算符,按照自右向左結合順序.例:a=(b=5)

/*b=5,a=5,由於“=”右結合,等價於a=b=5*/a=b=c=5/*運算式值為5*/a=5+(c=6)

/*c=6,a=11,運算式值為11*/a=(b=10)/(c=2)

/*b=10,c=2,a=5,運算式值為5*/ a+=a-=a*a

/*設a初值為12,則最後結果為-264*/

a+=a=a-a*a=12-12*12=-132a=a+a=(-132)+(-132)=-264

printf(“%d”,a=b);/*將b的賦給a,並輸出a的值*/§10

TurboC的特殊運算符

1.“?:”條件運算符

“?:"運算符是一個三目運算符,其一般形式是:<運算式1>?<運算式2>:<運算式3>;

"?:"運算符的含義是:先求運算式1的值,如果為真,則求運算式2的值並把它作為整個運算式的值;如果運算式1的值為假,則求運算式3的值並把它作為整個運算式的值。【例】

main(){

intx,y;x=50;y=x>70?100:0;/*將條件運算式的結果賦於y*/}

本例中,y將被賦初值0。如果x>70,y將被賦值100。因此,"?"運算符可以代替某些if-then-else形式的語句。

2."&"和"*"運算符

"&"運算符是一個返回運算元地址的單目操作符。

"*"運算符是對"&"運算符的一個補充,它返回位於這個地址內的變數值,也是單目操作符。【例】main(){

inti,j,*m;i=10;m=&i;j=*m;}/*將變數i的地址賦給m*//*地址m所指的單元的值賦給j*/

上面程式運行後,i=10,m為其對應的記憶體地址,j的值也為10。3.“,”逗號運算符和逗號運算式“,”運算符(順序運算符):用於將多個運算式串在一起,是所有運算符中優先順序別最低的運算符逗號運算式:<運算式1>,<運算式2>逗號運算式求解過程:兩個運算式按從左向右順序求值,每個運算式的求值是分開進行的,先求<運算式1>,再求<運算式2>,逗號運算式的值是運算式2的值,對逗號運算符不進行類型轉換。【例】

main(){

intx,y;x=50;y=(x=x-5,x/5);/*x減5後為45賦給x,再x/5為9賦給y*/

printf(“x=%d,y=%d\n”,x,y);/*但不賦於a*/}運行結果:x=45,y=9嵌套的逗號運算式一個逗號運算式與另一個運算式組成的一個新的運算式。其結果和類型同最後一個運算式值。例:(a=3*5,a*4),a+5/*運算式的值為20*/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论