版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第1章C語言基礎(chǔ)1.1C語言概述1.2基本語法成份1.3C程序的結(jié)構(gòu)1.4C程序的實(shí)現(xiàn)1.1C語言概述1.1.1C語言的產(chǎn)生與發(fā)展1.C語言的產(chǎn)生
C語言于1972年~1973年間,誕生于美國的貝爾實(shí)驗(yàn)室,由Denis.M.Ritchie創(chuàng)建。
C語言的產(chǎn)生基于兩個(gè)方面的需要。一是為滿足UNIX操作系統(tǒng)開發(fā)的需要。UNIX操作系統(tǒng)是一個(gè)通用的、復(fù)雜的計(jì)算機(jī)管理系統(tǒng)。二是為拉近高級語言與硬件之間距離的需要。
C語言集高級語言與匯編語言優(yōu)點(diǎn)于一身。
C語言面對實(shí)際應(yīng)用的需要而產(chǎn)生,直至今日仍不改初衷。2.C語言的發(fā)展1960年出現(xiàn)的ALGOL語言是一種面向問題的高級語言,遠(yuǎn)離硬件,不適于開發(fā)系統(tǒng)軟件。1963年,英國劍橋大學(xué)推出CPL語言,CPL語言比ALGOL語言接近硬件一些,但規(guī)模較大,難以實(shí)現(xiàn)。1969年,劍橋大學(xué)的M.Richards對CPL語言進(jìn)行簡化,推出BCPL語言(BCPL—BasicCombinedProgrammingLanguage)。1970年,貝爾實(shí)驗(yàn)室的K.Thompson為DEC公司PDP[CD*2]7計(jì)算機(jī)上運(yùn)行的一種早期UNIX操作系統(tǒng)設(shè)計(jì)了一種類BCPL語言,稱為B語言。B語言規(guī)模小,接近硬件,1971年在PDP-11計(jì)算機(jī)上實(shí)現(xiàn),并寫了UNIX操作系統(tǒng)。1960年~1971年是C語言的萌芽階段。1972年~1973年間,貝爾實(shí)驗(yàn)室的D.M.Ritchie在保留B語言優(yōu)點(diǎn)的基礎(chǔ)上,創(chuàng)建了C語言。1973年,UNIX操作系統(tǒng)被用C語言改寫,稱為UNIX第五版。最初的C語言只是一種UNIX操作系統(tǒng)的工作語言,依附于UNIX系統(tǒng),主要在貝爾實(shí)驗(yàn)室內(nèi)部使用。
UNIX以后的第六版、第七版、SYSTEMⅢ和SYSTEMⅤ都是在第五版的基礎(chǔ)上發(fā)展起來的,C語言也作了多次改進(jìn)。到1975年,UNIX第六版的公布,使C語言受到人們的普遍注意。UNIX操作系統(tǒng)的廣泛使用,促進(jìn)了C語言的迅速發(fā)展與普及,C語言的發(fā)展與普及也促進(jìn)了UNIX操作系統(tǒng)的推廣。到1978年出現(xiàn)了獨(dú)立于UNIX和PDP計(jì)算機(jī)的C語言,從而,C語言被迅速移植到大、中、小與微型機(jī)上。當(dāng)年,B.W.Kernighan和D.M.Ritchie以UNIX第七版的C編譯程序?yàn)榛A(chǔ),出版了影響深遠(yuǎn)的名著《C程序設(shè)計(jì)語言》。
C++語言是C語言發(fā)展的新階段,是一種更好的C語言,是應(yīng)用廣泛的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。
3.C語言的標(biāo)準(zhǔn)與方言
各機(jī)構(gòu)推出了自己的C語言與版本,某些執(zhí)行過程的微小差別不時(shí)引起C程序之間的不兼容。美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)從1983年開始,經(jīng)過長達(dá)五年的努力,制定了C語言的新標(biāo)準(zhǔn)——ANSIC,現(xiàn)在提及C語言的標(biāo)準(zhǔn)就是指該新標(biāo)準(zhǔn)。ANSIC比原標(biāo)準(zhǔn)C有很大的發(fā)展,解決了經(jīng)典定義中的二義性,給出了C語言的新特點(diǎn)。K&R也以新標(biāo)準(zhǔn)改寫了他們的經(jīng)典著作。任何C程序都必須遵循ANSIC標(biāo)準(zhǔn),本教材的主體也以ANSIC作為基礎(chǔ)。1.1.2C語言的特點(diǎn)
(1)C語言簡潔、緊湊,壓縮了一切不必要的成份。
(2)C語言運(yùn)算豐富,將括號、賦值、強(qiáng)制類型轉(zhuǎn)換、取變量地址等都以運(yùn)算實(shí)現(xiàn)。
(3)C語言數(shù)據(jù)類型豐富,具有現(xiàn)代語言的各種數(shù)據(jù)類型;用戶能擴(kuò)充數(shù)據(jù)類型,能夠?qū)崿F(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu),完成各種問題的數(shù)據(jù)描述。
(4)C語言是一種結(jié)構(gòu)化程序設(shè)計(jì)語言,具有結(jié)構(gòu)化語言所要求的三種基本結(jié)構(gòu)。(5)C語言允許直接訪問物理地址,能進(jìn)行位運(yùn)算,能實(shí)現(xiàn)匯編語言的大部分功能,能直接對硬件進(jìn)行操作。C語言是高級語言中的低級語言。
(6)C語言提供預(yù)處理機(jī)制,有利于大程序的編寫和調(diào)試。
(7)C語言編譯系統(tǒng)小,生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。
(8)C語言輸入/輸出功能用庫函數(shù)實(shí)現(xiàn),編寫的程序移植性好。
(9)C語言語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大,對程序員要求不高。1.2基本語法成份1.2.1字符集
字符是可以區(qū)分的最小符號,構(gòu)成程序的原始基礎(chǔ)。C語言字符集是ASCII字符集的一個(gè)子集,包括英文字母、數(shù)字及特殊字符:
·
英文字母:a~z和A~Z
·
數(shù)字:0~9
·
特殊字符:空格?。?^&*--+=~<>/\|.,:;?′″()[]{}
由字符集中的字符可以構(gòu)成C語言進(jìn)一步的語法成份,如標(biāo)識符、關(guān)鍵字、特殊的運(yùn)算符等。1.2.2標(biāo)識符
標(biāo)識符在程序中用來標(biāo)識各種程序成份,命名程序中的一些實(shí)體,如變量、常量、函數(shù)、類型、標(biāo)號等對象的名字。
C語言規(guī)定,標(biāo)識符必須以英文字母或下劃線開頭,是字母、數(shù)字、下劃線的序列。以下是合法的標(biāo)識符:x,c,a1,a2,op,y-1,zhou-prg,radius,prime,program,prg-1,cout,sun,day
以下是不合法的標(biāo)識符:a.1,1computer,x+y,!abc,99999,$100,π,3cC語言中標(biāo)識符要區(qū)分大小寫,標(biāo)識符abc與標(biāo)識符ABC是不同的標(biāo)識符。習(xí)慣上符號常量用大寫字母表示,變量名稱用小寫字母表示。標(biāo)準(zhǔn)C中,標(biāo)識符的長度可以是任意的,一般有效長度為8個(gè)字符,TURBOC中標(biāo)識符最大長度為32個(gè)字符。標(biāo)識符取名時(shí)不能與關(guān)鍵字同名,也不能與系統(tǒng)預(yù)先定義的標(biāo)準(zhǔn)標(biāo)識符(如標(biāo)準(zhǔn)函數(shù))同名,最好能“見名知義”,以提高程序的可讀性。一般選用相應(yīng)英文單詞或拼音的縮寫形式,盡量不要使用簡單代數(shù)符號,如a,b,c,x,y,z等。標(biāo)識符大多數(shù)采用“匈牙利”表示法,每個(gè)單詞第一個(gè)字母大寫,如StudentName、YearMonthDate。1.2.3關(guān)鍵字
關(guān)鍵字又稱為保留字,由系統(tǒng)提供,用以表示特定的語法成份,如類型名稱int、float,語句特征if、switch、while,運(yùn)算符號sizeof等,是構(gòu)成C語言的語法基礎(chǔ)。常見關(guān)鍵字有31個(gè),參見附錄A。關(guān)鍵字有特定的語法含義,不允許用戶重新定義。關(guān)鍵字在程序中像國家的名字一樣,絕對不能拼錯(cuò)。1.2.4運(yùn)算符運(yùn)算符實(shí)際上可以認(rèn)為是系統(tǒng)定義的函數(shù)名字,這些函數(shù)作用于運(yùn)算對象,得到一個(gè)結(jié)果值。運(yùn)算符通常由1個(gè)或多個(gè)字符構(gòu)成。根據(jù)運(yùn)算對象的個(gè)數(shù)不同,運(yùn)算符可分為單目運(yùn)算符、雙目運(yùn)算符和三目運(yùn)算符,又稱為一元運(yùn)算符、二元運(yùn)算符和三元運(yùn)算符。1.3C程序的結(jié)構(gòu)例1-1
在屏幕上輸出“C語言程序設(shè)計(jì)”。/*程序1[CD*2]1,輸出″thisisaCprogram.″*/#include″stdio.h″main(){printf(″thisisaCprogram.\n″);}運(yùn)行結(jié)果:thisisaCprogram.例1–2
求兩個(gè)整數(shù)之和。
/*程序1-2,求兩個(gè)整數(shù)之和*/
#include″stdio.h″main(){inta,b;intsum;scanf(″%d,%d″,&a,&b);sum=a+b;printf(″sum=%d\n″,sum);}輸入數(shù)據(jù):1999,1運(yùn)行結(jié)果:和=2000例1-3
求兩個(gè)數(shù)的最大值。
/*程序1-3,求兩個(gè)數(shù)的最大值*/
#include″stdio.h″intmax(intx,inty)/*求最大值函數(shù){intt;if(x>y)t=x;elset=y;return(t);}main()/*主函數(shù)*/{inta,b;intc;scanf(″%f,%f″,&a,&b);c=max(a,b);/*調(diào)用求最大值的函數(shù)*/printf(″max=%d\n″,c);}輸入數(shù)據(jù):12,3運(yùn)行結(jié)果:max=121.3.1C程序的結(jié)構(gòu)1.函數(shù)
(1)C程序由若干函數(shù)組成,其核心成份是函數(shù)。①必須有一個(gè)且只能有一個(gè)主函數(shù)main(),主函數(shù)的名字為main。②可以是系統(tǒng)預(yù)定義的標(biāo)準(zhǔn)函數(shù),如scanf函數(shù)、printf函數(shù)等,參見附錄C。大多數(shù)函數(shù)由程序員根據(jù)實(shí)際問題的需要進(jìn)行定義,函數(shù)之間是平行的關(guān)系?;诖?C語言被稱為函數(shù)式語言。(2)函數(shù)由函數(shù)頭(函數(shù)的說明部分)與函數(shù)體(函數(shù)的語句部分)兩部分組成。①函數(shù)頭給出函數(shù)的特征描述,包括函數(shù)的屬性、類型、名字、參數(shù)及參數(shù)類型。如例1[CD*2]3中的求最大值函數(shù)的函數(shù)頭:intmax(intx,inty)/*函數(shù)屬性缺省,函數(shù)類型整型,函數(shù)名字max,函數(shù)參數(shù)x,y,整型*/等同于intmax(x,y)intx,y;②函數(shù)體給出函數(shù)功能實(shí)現(xiàn)的數(shù)據(jù)描述和操作描述,是程序中用花括號括起的若干語句。如例1-1中的函數(shù)體:{printf(″thisisaCprogram.″);}
函數(shù)體可以為空,可以沒有數(shù)據(jù)描述部分。2.語句
(1)語句是組成程序的基本單位,函數(shù)功能的實(shí)現(xiàn)由若干條語句完成。說明性語句完成數(shù)據(jù)描述,執(zhí)行性語句完成操作描述。
(2)語句由若干關(guān)鍵字加以標(biāo)識,如if-else語句、do-while語句等。C語言語句必須以分號結(jié)束。
(3)C語言本身沒有輸入/輸出語句,C語言的輸入/輸出操作由scanf函數(shù)和printf函數(shù)等庫函數(shù)完成。3.其它
1)預(yù)處理命令
C程序開始往往含有以“#”開頭的命令,它們是預(yù)處理命令。如例1-1中#include″stdio.h″,用以指明包含文件。請參閱第12章。
2)程序注釋在程序中還有以“/*”開始,以“*/”結(jié)束的內(nèi)容,它們是程序中的注釋部分,用以幫助閱讀程序。注釋對程序的執(zhí)行沒有任何影響,編譯時(shí)將被過濾掉。加必要的注釋只為增加程序的可讀性。1.3.2C程序的書寫(1)一行一般寫一條語句。當(dāng)然一行可以寫多條語句,一條語句也可以寫在多行上。
(2)整個(gè)程序采用緊縮格式書寫。表示同一層次的語句行對齊,縮進(jìn)同樣多的字符位置。如循環(huán)體中的語句要縮進(jìn)對齊,選擇體中的語句要縮進(jìn)對齊。
(3)花括號的書寫方法較多,本書采用花括號對齊的書寫方式,左邊花括號處于第一條語句的開始位置,右邊花括號獨(dú)占一行,與左邊花括號對齊。
(4)在程序中恰當(dāng)?shù)厥褂每招?,分隔程序中的語句塊,增加程序的可讀性。1.4C程序的實(shí)現(xiàn)1.4.1實(shí)現(xiàn)步驟C程序在計(jì)算機(jī)上的實(shí)現(xiàn)與其它高級語言程序的實(shí)現(xiàn)一樣,一般要經(jīng)過編輯、編譯、連接、運(yùn)行四個(gè)步驟,如圖1-1所示。圖1-11.編輯
編輯是將C語言的源程序輸入計(jì)算機(jī),并以文本文件的形式存儲在磁盤。編輯是建立C源程序文件的過程,源程序文件的擴(kuò)展名為.C或.CPP。編輯可以用任何文字處理軟件完成,一般用編譯器本身集成的編輯器進(jìn)行編輯。2.編譯
C語言是以編譯方式實(shí)現(xiàn)的高級語言,C程序的實(shí)現(xiàn)必須經(jīng)過編譯程序?qū)υ闯绦蜻M(jìn)行編譯,生成目標(biāo)代碼程序。目標(biāo)代碼程序的擴(kuò)展名為.OBJ。編譯前先進(jìn)行預(yù)處理。編譯過程主要進(jìn)行詞法分析和語法分析。編譯有錯(cuò)時(shí),在屏幕上列出錯(cuò)誤的位置和種類。此時(shí),要返回到編輯步驟修改源程序,修改后,再進(jìn)行編譯。3.連接
編譯形成的目標(biāo)代碼程序機(jī)器可以識別,但還不能直接執(zhí)行,還需要將目標(biāo)代碼程序與庫文件進(jìn)行連接處理,連接工作由連接程序完成。經(jīng)過連接,生成可執(zhí)行文件??蓤?zhí)行文件的擴(kuò)展名為.EXE。連接有錯(cuò)同樣需返回到編輯步驟修改源程序,修改后,再進(jìn)行編譯、連接。4.運(yùn)行
一個(gè)C源程序經(jīng)過編譯、連接后生成了可執(zhí)行文件。運(yùn)行可執(zhí)行文件,可通過編譯系統(tǒng)下的運(yùn)行功能,也可像執(zhí)行DOS的外部命令一樣,輸入執(zhí)行文件名運(yùn)行。程序運(yùn)行后,一般在屏幕上顯示運(yùn)行結(jié)果。根據(jù)運(yùn)行結(jié)果可以判斷程序是否還有算法方面的錯(cuò)誤。編譯時(shí)產(chǎn)生的錯(cuò)誤是語法錯(cuò)誤,運(yùn)行時(shí)出現(xiàn)的錯(cuò)誤是邏輯錯(cuò)誤。出現(xiàn)邏輯錯(cuò)誤時(shí)需要修改算法,重新編輯、編譯、運(yùn)行程序。1.4.2程序的執(zhí)行C程序的執(zhí)行總是從主函數(shù)main()開始,不管主函數(shù)在程序中什么位置。主函數(shù)中的語句依先后順序執(zhí)行,除非改變了程序的執(zhí)行流程。其它函數(shù)通過被調(diào)用執(zhí)行。1.4.3TURBOC上機(jī)操作1.啟動(dòng)TURBOC
只需執(zhí)行TC.EXE文件,即可啟動(dòng)TURBOC進(jìn)入TURBOC的操作界面。如使用中文,需先將計(jì)算機(jī)置于中文操作系統(tǒng)管理之下。用TC加源程序文件名可快速啟動(dòng)TURBOC,立即進(jìn)入編輯操作。2.TURBOC操作界面啟動(dòng)TURBOC后,主操作界面如圖1-2所示。圖1-21)組成
TURBOC主操作界面由主菜單區(qū)、編輯窗口、信息窗口、熱鍵區(qū)四部分組成。
TURBOC的操作采用菜單驅(qū)動(dòng),主菜單包括File(文件操作)、Edit(編輯操作)、Run(運(yùn)行操作)、Compile(編譯操作)、Project(工程文件)、Options(編譯選擇)及Debug(跟蹤排錯(cuò))各項(xiàng)。熱鍵區(qū)提供常用操作的快速功能鍵方式,如F1(幫助)、F2(保存文件)、F3(裝入文件)、F5(縮放窗口)、F6(切換窗口)、ALT+F5(用戶屏幕)、ALT+X(退出TURBOC)等。2)主窗口當(dāng)前操作窗口為主窗口(工作窗口),主窗口為雙線框表示,按F6可切換主窗口,按F5可縮放主窗口。
3)菜單選擇方式一:按F10進(jìn)入主菜單區(qū),通過菜單項(xiàng)的大寫字母選擇相應(yīng)菜單項(xiàng),或通過光標(biāo)控制鍵(→、←、↑、↓)移動(dòng)高亮度光棒至相應(yīng)菜單項(xiàng),按回車選擇相應(yīng)菜單項(xiàng)。方式二:用熱鍵ALT加相應(yīng)菜單項(xiàng)的大寫字母,選擇相應(yīng)菜單項(xiàng)。對子菜單項(xiàng)的選擇,操作方法類似。3.編輯
編輯在編輯窗口中進(jìn)行,有多種方式進(jìn)入編輯環(huán)境:
方式一:選擇Edit項(xiàng)。方式二:選擇File項(xiàng)的子項(xiàng)New,用于編輯新程序。方式三:選擇File項(xiàng)的子項(xiàng)Load,裝入要修改的程序,用于修改程序。方式四:啟動(dòng)時(shí)采用快速啟動(dòng)方式。
TURBOC的編輯操作是Wordstar、WPS等字處理軟件編輯操作的子集,它與Wordstar、WPS的編輯操作完全類似。
4.編譯
TURBOC將編譯、連接一道完成。按熱鍵F9或選擇Compile項(xiàng)進(jìn)入編譯。編譯時(shí)發(fā)生錯(cuò)誤,返回編輯步驟,修改程序后,再編譯程序。
5.運(yùn)行按熱鍵CTRL+F9或選擇Run項(xiàng)下的子項(xiàng)Run,運(yùn)行計(jì)算機(jī)中的程序。按ALT+F5鍵或選擇Run項(xiàng)下的子項(xiàng)UserScreen進(jìn)入用戶屏幕,查看程序運(yùn)行結(jié)果。運(yùn)行時(shí)發(fā)生錯(cuò)誤,返回編輯步驟,修改程序后,再編譯、運(yùn)行程序。對于沒編譯的程序,選擇運(yùn)行會先自動(dòng)進(jìn)行編譯操作,再運(yùn)行程序。
算法舉例
例1求5!(1×2×3×4×5)
s1,1→ps2,2→Is3,P×i→ps4,I+1→Is5,輸出p完整的算法s1,1→p
s2,2→I
s3,當(dāng)I<=5為真時(shí)到s4;為假時(shí)到s7
s4,P×i→ps5,I+1→I
s6,轉(zhuǎn)到s3
s7,輸出p
開始1→p2→II<=5ftP×i→pI+1→I
輸出p
結(jié)束循環(huán)1→p2→II<=5P×i→pI+1→I輸出p流程圖表示N-S圖表示計(jì)算機(jī)語言表示Main(){intp,I;p=1;I=2;while(I<=5){p=p*I;I++;}printf(“%d”,p);}例250個(gè)學(xué)生,打印成績大于等于80的學(xué)生的學(xué)號和成績。s1,I=1s2,I<=50為真時(shí)到s3;為假時(shí)到s6s3,gi>=80為真時(shí)打印ni和gi;為假時(shí)空操作s4,I=I+1s5,轉(zhuǎn)到s2s6,結(jié)束開始1→iI<=50打印ni和giI+1→IGi>=80結(jié)束1→iI+1→ItGi>=80f打印ni和giI+1→I流程圖表示N-S圖表示fttf偽代碼表示BEGIN(算法開始)I=1;WhileI<=50{inputn1andgiI=I+1;}I=1;whileI<=50{ifgi>=80printniandgiI=I+1}END(算法結(jié)束)三種基本結(jié)構(gòu)的n-s圖表示
ABTPFAB順序結(jié)構(gòu)選擇結(jié)構(gòu)當(dāng)P1成立
AB
直到P1成立當(dāng)型循環(huán)結(jié)構(gòu)直到型循環(huán)構(gòu)例4求1-1/2+1/3-1/4+…+1/99-1/00算法可表示如下:S1,sign=1S2,sum=1S3,deno==2S4,sign=(-1)*signS5,term=sign*(1/deno)S6,sum=sum+termS7,deno=deno+1S8,若deno<=100返回s4,否則算法結(jié)束開始Sum=1Deno=2sign-=1sign=(-1)*signterm=sign*(1/deno)sum=sum+termdeno=deno+1NDeno>100Y結(jié)束sum=1Deno=2Sign=1Sign=(-1)*signTerm=sign*1/denosum=sum+termDeno=deno+1直到deno>100
打印sumN-S圖表示流程圖表示計(jì)算機(jī)語言表示Main(){intsign=1;floatdeno=2.0;,sum=1.0,term;while(deno<=100){sign=-sign;term=sign/deno;sum=sum+term;deno=deno+1;}Printf(“%f”,sum);}習(xí)題:有一分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個(gè)數(shù)列的前20項(xiàng)之和.例5:對于一個(gè)大于或等于3的正整數(shù),判斷它是不是一個(gè)素?cái)?shù)S1:輸入n的值s2:I=2(I作為除數(shù))S3:N被I除,得余數(shù)rS4:如果r=0,表示n能被I整除,則打印n”不是素?cái)?shù)“,算法結(jié)束;否則轉(zhuǎn)到s5S5:I=I+1S6:如果I<=n-1,返回s3;否則打印n”是素?cái)?shù)“,然后結(jié)束.輸入nW=0I=2R=n/I的余數(shù)是r=0否W=1I=I+1直到了I>或w<>0是w=0否輸出n是素?cái)?shù)輸出n不是素?cái)?shù)N-S圖表示計(jì)算機(jī)語言表示#include<math.h>Main(){intn,I,k;scanf(“%d”,&n);k=sqrt(n);for(I=2;I<=k;I++)if(n%I==0)break;if(I>k)printf(“%disaprimenumber”,n);elseprintf(“%disnotaprimenumber”,n);}結(jié)構(gòu)化程序設(shè)計(jì)方法
例6:用篩法(埃拉托色尼篩法)求1-200之間的所有素?cái)?shù)
1234567891011121314151617181920………….200A:B:C:
輸入1~n
把所有非素?cái)?shù)去掉
打印全部素?cái)?shù)輸入n的值I=1當(dāng)I<=nxi=II=I+1A:將x1去掉(使x1=0)I=2當(dāng)I<n的平方根的整數(shù)如xi未去掉,則xi+1xn間全部是xi倍數(shù)的數(shù)去掉
I=I+1B:I=1
當(dāng)I<=n
打印未挖掉的xiI=I+1C:算法的進(jìn)一步細(xì)化B1B2B3D3.1數(shù)據(jù)類型-數(shù)據(jù)類型基本類型整型字符型實(shí)型(浮點(diǎn)型)單精度型雙精度型枚舉型構(gòu)造類型數(shù)組類型結(jié)構(gòu)體類型共用體類型指針類型空類型3.1.1常量的定義方法
常量是在程序運(yùn)算過程中不變的量。常量在程序中經(jīng)常直接出現(xiàn),如123、3.14159、′a′、″computer″,此時(shí)只要求它們符合相應(yīng)類型數(shù)據(jù)的表示方法。相應(yīng)于各種數(shù)據(jù)類型,有整型常量、浮點(diǎn)型常量、字符型常量及字符串常量。
常量定義是指定義符號常量,用一個(gè)標(biāo)識符來代表一個(gè)常量,通過宏定義預(yù)處理指令來實(shí)現(xiàn)。格式:#define標(biāo)識符常量由用戶命名的標(biāo)識符是符號常量名。作為符號常量名,一般大寫。一旦定義,在程序中凡是出現(xiàn)常量的地方均可用符號常量名來代替。對使用了符號常量的程序在編譯前會以實(shí)際常量替代符號常量。例2–5
求圓的面積。/*程序2-5,求圓的面積*/#definePI3.14#defineR2#include″stdio.h″main(){floats;s=PI*R*R;printf(″面積=%6.3f″,s);}運(yùn)行結(jié)果:面積=12.5603.1.2變量定義1.變量定義方法
i格式:類型名變量表;變量的值變量表是用逗號分開的變量名。例如:存儲單元①inti,j;/*定義i,j為整型變量*/②floatx,y;/*定義x,y為實(shí)型變量*/③charch;/*定義ch為字符型變量*/35
2.變量的初始化
定義了變量,變量并沒有值。可以在定義變量的同時(shí)給出初值,對變量進(jìn)行初始化。例如:①inti=9;/*定義整型變量i,初值為9*/②floatr=1.5;/*定義實(shí)型變量r,初值為1.5*/③charanswer=′y′;/*定義字符型變量answer,初值為字符y*/3.2整型3.2.1基本整型1.類型名稱
int
2.取值范圍
-32768~+32767(-215~215-1)
3.數(shù)據(jù)表示方法與數(shù)學(xué)上類似,不能有分隔符。C語言允許使用八進(jìn)制整數(shù)與十六進(jìn)制整數(shù),八進(jìn)制整數(shù)加前導(dǎo)0(數(shù)字),十六進(jìn)制整數(shù)加前導(dǎo)0X。
4.運(yùn)算操作
(1)算術(shù)運(yùn)算包括:+(加法)、-(減法)、*(乘法)、/(除法)、%(求余),運(yùn)算規(guī)則除除法外,與數(shù)學(xué)中相同。整數(shù)的除法運(yùn)算是整除,得到商,如5/3結(jié)果為1。對于負(fù)數(shù),多數(shù)機(jī)器采用向零取整法,如-5/3結(jié)果為-1。求余運(yùn)算,又稱取模運(yùn)算,得到余數(shù),如5%3結(jié)果為2,-5%3結(jié)果為-2。求余運(yùn)算在許多場合都非常有用,如判斷整數(shù)a是不是b的倍數(shù),可看a%b是否等于零。a%10得到a的個(gè)位數(shù)字,a/10)%10得到a的十位數(shù)字,如此可分離一個(gè)整數(shù)的數(shù)字。一般只有除數(shù)大于0,求余運(yùn)算才有意義。當(dāng)a小于0時(shí),a%b等于-((-a)%b)。(2)關(guān)系運(yùn)算包括:<(小于)、<=(小于等于)、==(等于)、!=(不等于)、>(大于)、>=(大于等于)等六種,運(yùn)算規(guī)則與數(shù)學(xué)中相同,運(yùn)算結(jié)果為邏輯類型數(shù)據(jù)。關(guān)系運(yùn)算成立結(jié)果為1,不成立結(jié)果為0。5.存儲
C標(biāo)準(zhǔn)沒有具體規(guī)定各類數(shù)據(jù)存儲的字節(jié)數(shù),各種機(jī)器處理有所不同,一般以一個(gè)機(jī)器字(Word)存放1個(gè)int數(shù)據(jù),PC機(jī)上int數(shù)據(jù)存儲用兩個(gè)字節(jié)。機(jī)器中用最高位表示數(shù)的符號,正數(shù)符號位用0表示,負(fù)數(shù)符號位用1表示。負(fù)數(shù)在機(jī)器中存放的是其補(bǔ)碼。6.應(yīng)用例2-1
求兩個(gè)整數(shù)的積。/*程序2-1,求兩個(gè)整數(shù)之積*/#include″stdio.h″main(){inta,b;intm;printf(″請輸入兩個(gè)整數(shù)a,b:″);scanf(″%d,%d”,&a,&b);m=a*b;printf(″積=%d\n″,m);}輸入數(shù)據(jù):2000,1運(yùn)行結(jié)果:積=20003.2.2拓展整型為拓展數(shù)據(jù)處理的范圍,C語言通過類型修飾符來改變基本數(shù)據(jù)類型的含義,使之精確適合于不同應(yīng)用場合。拓展后的整型有短整型、長整型及無符號整型。
1.類型修飾符
short:縮短數(shù)值所占字節(jié)數(shù)。
long:擴(kuò)大數(shù)值所占字節(jié)數(shù)。
signed:有符號位,缺省方式。
unsigned:無符號位。2.短整型短整型類型名稱為shortint或short,在TURBOC中,短整型與基本整型相同。
3.長整型長整型類型名稱為longint或long,取值范圍為-231~231-1(-2147483648~2147483647),長整型數(shù)據(jù)可加后綴L表示,在TURBOC中,存儲占4個(gè)字節(jié),運(yùn)算與基本整型相同。
4.無符號整型
無符號數(shù)與有符號數(shù)的主要區(qū)別是數(shù)的最高位不作符號處理,表示數(shù)的絕對范圍是有符號數(shù)的兩倍。相應(yīng)的無符號整型有無符號基本整型、無符號短整型和無符號長整型。無符號基本整型,類型名稱為unsignedint或unsigned,取值范圍為0~65535(0~216-1),存儲占兩個(gè)字節(jié)。無符號短整型,類型名稱為unsignedshortint或unsigned,取值、運(yùn)算、存儲同無符號基本整型。無符號長整型,類型名稱為unsignedlongint或unsignedlong,取值范圍為0~4294967295(0~232-1),存儲占4個(gè)字節(jié)。無符號整型常用于處理大整數(shù)及地址數(shù)據(jù)。例2–2
整數(shù)9的機(jī)器表示。作為int,0000000000001001作為shortint,0000000000001001作為longint,00000000000000000000000000001001以上第一位為符號位,表示正整數(shù)。以下第一位為正常的數(shù)據(jù)位,非符號位。作為unsignedint,0000000000001001作為unsignedshortint,0000000000001001作為unsignedlongint,000000000000000000000000000010013.3浮點(diǎn)型3.3.1單精度型1.類型名稱float2.取值范圍
絕對值范圍為10-38~1038,7位有效數(shù)字。3.數(shù)據(jù)表示方法
實(shí)數(shù)有一般形式和指數(shù)形式兩種表示方法。一般形式又稱小數(shù)表示法,是一種常規(guī)形式,由整數(shù)部分、小數(shù)點(diǎn)、小數(shù)部分三部分組成。C語言中的實(shí)數(shù)可以沒有小數(shù)部分或沒有整數(shù)部分,如20.,.375。指數(shù)形式由尾數(shù)、指數(shù)符號e或E、指數(shù)三部分組成,尾數(shù)是一般形式的實(shí)數(shù)。指數(shù)形式適于表示較大或較小的實(shí)數(shù)。如2.34e10、2.34e-10,相應(yīng)于數(shù)學(xué)中2.34×1010、2.34×10-10
。4.運(yùn)算操作
實(shí)型數(shù)據(jù)的運(yùn)算操作有算術(shù)運(yùn)算和關(guān)系運(yùn)算兩大類,運(yùn)算符同整型,運(yùn)算規(guī)則與數(shù)學(xué)中實(shí)數(shù)的運(yùn)算規(guī)則相同,但運(yùn)算結(jié)果可能是一個(gè)近似值。實(shí)數(shù)沒有求余運(yùn)算。
5.存儲
4個(gè)字節(jié)6.應(yīng)用例2–3
求兩個(gè)實(shí)數(shù)的積。/*程序2-3,求兩個(gè)實(shí)數(shù)之積*/#include″stdio.h″main(){floata,b;floatm;printf(″請輸入兩個(gè)整數(shù)a,b:″);scanf(″%f,%f″,&a,&b);m=a*b;printf(″積=%6.3f\n″,m);
輸入數(shù)據(jù):1.1,2.21運(yùn)行結(jié)果:積=2.4313.3.2雙精度型雙精度型類型名稱為double或longfloat,取值的絕對值范圍為10-308~10308,16位有效數(shù)字,數(shù)的表示與運(yùn)算操作同單精度型,8個(gè)字節(jié)存儲,能提高計(jì)算精度。計(jì)算機(jī)中太大的數(shù)不能表示,太小的數(shù)也不能表示,超出數(shù)的表示范圍稱為溢出,相應(yīng)的有上溢與下溢。對于太大數(shù)的處理必須通過間接的方法進(jìn)行。3.4字符型3.4.1字符類型
1.類型名稱
char
2.取值范圍
ASCII碼字符集中的字符。3.數(shù)據(jù)表示方法
字符數(shù)據(jù)用單引號作界定符,如′a′、′+′、′%′、′:′、′1′、′2′。注意:單引號字符本身及雙引號、反斜杠字符由于有特定的含義,不能如此表示,數(shù)字字符與數(shù)字不同。字符數(shù)據(jù)本身除了可以直接出現(xiàn),還可以通過反斜杠后跟ASCII碼描述。ASCII碼可采用3位八進(jìn)制數(shù)或2位十六進(jìn)制數(shù),相應(yīng)描述形式是\ddd與\xhh(位數(shù)不夠,加0補(bǔ)位),這種表示方法稱為轉(zhuǎn)義表示或轉(zhuǎn)碼表示。尤其是一些特殊的字符只能這樣表示,如圖形字符′■′的表示′\376′,單引號、雙引號、反斜杠可表示成′\047′、′\042′、′\134′。
如此字符A可表示為′A′、′\101′、′\x41′。對一些常用的特殊字符,C語言還提供特定的字符來轉(zhuǎn)義表示:′\n′:回車換行′\\′:反斜杠字符
′\′′:單引號字符′\′′:雙引號字符
′\a′:響鈴報(bào)警′\b′:退格
′\f′:走紙換行′\r′:回車
′\t′:橫向跳格′\u′:豎向跳格
4.運(yùn)算操作
C語言的字符數(shù)據(jù)實(shí)際存儲其ASCII碼,存儲形式與整數(shù)的存儲形式類似。C語言中規(guī)定字符數(shù)據(jù)與整型數(shù)據(jù)在ASCII碼取值范圍內(nèi)通用,因而C語言中字符數(shù)據(jù)可進(jìn)行整型數(shù)據(jù)的運(yùn)算及操作。例如:①′a′+′b′,等于97+98;②′a′+2,等于97+2;③′a′<′b′等于97<98。5.存儲
1個(gè)字節(jié)。6.應(yīng)用例2-4
輸出ASCII碼表。/*程序2-4,輸出ASCII碼表*/#include″stdio.h″main(){inti;printf(″ASCII碼表\n″);for(i=0;i<=255;i++)printf(″字符%c,ASCII碼%d\n″,i,i);}3.4.2字符串?dāng)?shù)據(jù)1.字串表示
字串?dāng)?shù)據(jù)用雙引號作界定符,如:″chinaone″、″computer″、″$123.45″、″\nabc″、″%d%f″2.字串存儲字串?dāng)?shù)據(jù)存儲除存儲構(gòu)成字符串的字符序列本身外,還必須附加存儲字串的結(jié)束標(biāo)志空操作字符′\0′存儲一個(gè)字串的字節(jié)數(shù)等于字符個(gè)數(shù)加1,即字串長度再加1。
3.字串類型
3.5邏輯類型3.5.1邏輯類型
C語言沒有專門提供邏輯類型,而是借用整型、字符型、實(shí)型來描述邏輯數(shù)據(jù)。
C語言規(guī)定,0作為邏輯數(shù)據(jù)代表假,非0的數(shù)作為邏輯數(shù)據(jù)代表真。在一個(gè)式子里面要注意區(qū)分作為普通數(shù)據(jù)的數(shù)與作為邏輯數(shù)據(jù)的數(shù)。
C語言同時(shí)規(guī)定,邏輯數(shù)據(jù)真為1,邏輯數(shù)據(jù)假為0。如:2<3為真,表達(dá)式的值為1;2>3為假,表達(dá)式的值為0。3.5.2邏輯運(yùn)算
假定有邏輯數(shù)據(jù)p、q,邏輯運(yùn)算的運(yùn)算規(guī)則為:①!p,得到與p相反的邏輯數(shù)據(jù)。p為真,!p為假;p為假,!p為真;②p&&q,只有p、q同時(shí)為真時(shí),運(yùn)算結(jié)果為真;只要p、q有一個(gè)為假,運(yùn)算結(jié)果為假;③p||q,只要p、q中有一個(gè)為真,運(yùn)行結(jié)果為真;只有p、q同時(shí)為假,運(yùn)算結(jié)果為假。例如:①!(2>3)等于1;②(2>3)&&(3>2)等于0;③(2>3)||(3>2)等于1。3.6標(biāo)準(zhǔn)函數(shù)
函數(shù)調(diào)用通過函數(shù)名進(jìn)行,以實(shí)際數(shù)據(jù)(實(shí)參)代替函數(shù)中的參數(shù),即函數(shù)名(實(shí)參)。數(shù)學(xué)函數(shù)包含在頭文件math.h中,用#include″math.h″指明。參數(shù)x為double,或float,或int型數(shù),函數(shù)值為double型。常用的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)有:①acos(x),求x的反余弦,x必須在-1~1的范圍內(nèi)。②asin(x),求x的反正弦,x必須在-1~1的范圍內(nèi)。3.1表達(dá)式基礎(chǔ)3.1.1表達(dá)式的組成1.運(yùn)算符
運(yùn)算符又稱操作符,是一個(gè)符號,它指示在一個(gè)或多個(gè)操作數(shù)上完成某種運(yùn)算操作或動(dòng)作。
C語言中,除了輸入、輸出及程序流程控制操作以外的所有基本操作都作為運(yùn)算處理。如,賦值運(yùn)算符“=”、逗號運(yùn)算符“,”、括號運(yùn)算符“()”。①算術(shù)運(yùn)算符有+、—、*、/、%、++、--②關(guān)系運(yùn)算符有<、<=、==、!=、>、>=③邏輯運(yùn)算符有!、&&、||④位運(yùn)算符有<<、>>、~、|、^、&⑤賦值運(yùn)算符有=、+=、-=、*=、/=、%=⑥條件運(yùn)算符有?:⑦逗號運(yùn)算符有,⑧指針運(yùn)算符有*、&⑨求字節(jié)數(shù)運(yùn)算符有sizeof10強(qiáng)制類型轉(zhuǎn)換運(yùn)算符有(類型)11其它運(yùn)算符有.、→、()、[]等2.操作數(shù)
操作數(shù)是運(yùn)算符的操作對象,可以是常量、變量、函數(shù)與表達(dá)式。常量、變量、函數(shù)本身就是簡單表達(dá)式,從一般意義上講,C語言中所有操作數(shù)都是表達(dá)式。復(fù)雜表達(dá)式由運(yùn)算符連接簡單表達(dá)式形成。3.1.2表達(dá)式的書寫
C語言的表達(dá)式雖然來源于數(shù)學(xué)表達(dá)式,是數(shù)學(xué)表達(dá)式在計(jì)算機(jī)中的表示,但在書寫時(shí)應(yīng)該注意遵循C語言表達(dá)式書寫的原則:(1)C語言的表達(dá)式只能采用線性的形式書寫。例如:①應(yīng)寫成1/3+i+j*j*j。②應(yīng)寫成(a+b)/(c+d)*e+f。(2)C語言的表達(dá)式只能使用C語言中合法的運(yùn)算符和操作數(shù),對有些操作必須調(diào)用庫函數(shù)完成,而且運(yùn)算符不能省略。例如:①πr2應(yīng)寫成3.14159*r*r。②應(yīng)寫成0.5*a*b*sin(alph)。③|x-y|應(yīng)寫成fabs(x-y)。④y+2X
應(yīng)寫成y+pow(2,x)。3.1.3表達(dá)式的分類
C語言表達(dá)式種類很多,有多種分類方法。我們一般依據(jù)運(yùn)算的特征將表達(dá)式分為:①算術(shù)表達(dá)式,如a+b*2.0-3.0/5.0。②關(guān)系表達(dá)式,如x>=y,關(guān)系表達(dá)式可以認(rèn)為是邏輯表達(dá)式的特殊情況。③邏輯表達(dá)式,如(x>=2)&&(x<=8)。④賦值表達(dá)式,如a=b=c=1。⑤條件表達(dá)式,如(a>b)?a:b。⑥逗號表達(dá)式,如a=2,b=a*a,c=sqrt(b)。3.1.4表達(dá)式的計(jì)算1.運(yùn)算符優(yōu)先級C語言將運(yùn)算符的優(yōu)先級劃分為15級,初等運(yùn)算()、[]、→、.優(yōu)先級最高,單目運(yùn)算!、~、++、--、-、(類型)、*、&、sizeof優(yōu)先級次高,算術(shù)運(yùn)算+、-、*、/、%再次之,然后是關(guān)系運(yùn)算<、<=、==、!=、>、>=,再然后是邏輯運(yùn)算&&、||,條件運(yùn)算式?:,賦值運(yùn)算=、+=、-=、*=、/=、%=,逗號運(yùn)算優(yōu)先級最低,位運(yùn)算優(yōu)先級比較分散。2.運(yùn)算符的結(jié)合性
運(yùn)算符的結(jié)合性是指,優(yōu)先級相同的運(yùn)算從左到右進(jìn)行(左結(jié)合性)還是從右至左進(jìn)行(右結(jié)合性),左結(jié)合性是人們習(xí)慣的計(jì)算順序。
C語言中,只有單目運(yùn)算(!、~、++、--、-、*、&)、條件運(yùn)算(?:)、賦值運(yùn)算(=、+=、-=、*=、/=、%=)的結(jié)合性是右結(jié)合,其余運(yùn)算為左結(jié)合。3.類型轉(zhuǎn)換一般講相應(yīng)的運(yùn)算只有相應(yīng)類型的數(shù)據(jù)才能進(jìn)行,不同類型數(shù)據(jù)進(jìn)行運(yùn)算時(shí),要進(jìn)行類型轉(zhuǎn)換。類型轉(zhuǎn)換有自動(dòng)轉(zhuǎn)換(又稱隱含轉(zhuǎn)換)與強(qiáng)制轉(zhuǎn)換兩種方式。
(1)自動(dòng)轉(zhuǎn)換。自動(dòng)轉(zhuǎn)換由系統(tǒng)自動(dòng)完成,轉(zhuǎn)換的規(guī)則如圖3-1所示。Intusignedlongdouble↑↑short,charfloat圖3-1
縱向箭頭方向表示必定要進(jìn)行的轉(zhuǎn)換,short型、char型數(shù)據(jù)必定先轉(zhuǎn)換成int型,float型數(shù)據(jù)必定先轉(zhuǎn)換成double型,再進(jìn)行運(yùn)算。橫向箭頭方向表示類型自動(dòng)轉(zhuǎn)換的方向。由低向高轉(zhuǎn)換,int型最低,double型最高。int型與usingned型數(shù)據(jù)進(jìn)行運(yùn)算,int型轉(zhuǎn)換成unsigned;int型與long型數(shù)據(jù)進(jìn)行運(yùn)算,int型轉(zhuǎn)換成long型;int型與double型數(shù)據(jù)進(jìn)行運(yùn)算,int型轉(zhuǎn)換成double型。其它類推。這種轉(zhuǎn)換是一種保值映射,在轉(zhuǎn)換中數(shù)據(jù)的精度不受損失。(2)強(qiáng)制轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換通過類型轉(zhuǎn)換運(yùn)算進(jìn)行。格式:(類型名)(表達(dá)式)將表達(dá)式的類型強(qiáng)制轉(zhuǎn)換成類型名指定的類型。如:floatx,y;
(int)(x+y)將表達(dá)式x+y的值強(qiáng)制轉(zhuǎn)換成整型強(qiáng)制類型轉(zhuǎn)換在將高類型轉(zhuǎn)換為低類型時(shí),數(shù)據(jù)精度受損,是一種不安全的轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換是暫時(shí)性的,一次性的,并不永久改變所轉(zhuǎn)換表達(dá)式的類型。如:inta;
(double)a為雙精度,a依然為整型量。
例3–1表達(dá)式計(jì)算。(1)floatx=2.5,y=4.7;inta=7;計(jì)算x+a%3*(int)(x+y)%2/4⑦①④③②⑤⑥①a%3等于1。②x+y等于7.2。③(int)(x+y)等于7。④a%3*(int)(x+y)等于7。⑤a%3*(int)(x+y)%2等于1。⑥a%3*(int)(x+y)%2/4等于0。⑦x+a%3*(int)(x+y)%2/4等于2.5+0,結(jié)果為2.5。
第二項(xiàng)將由整型自動(dòng)轉(zhuǎn)換為雙精度型進(jìn)行運(yùn)算,計(jì)算結(jié)果為雙精度型。(2)inta=2,b=3;floatx=3.5,y=2.5;計(jì)算(float)(a+b)/2+(int)x%(int)y②①③⑦④⑥⑤①a+b等于5。②(float)(a+b)等于5.0,強(qiáng)制轉(zhuǎn)換成float型。③(float)(a+b)/2等于5.0/2.0,結(jié)果為2.5。④(int)x等于3,強(qiáng)制轉(zhuǎn)換成int型。⑤(int)y等于2,強(qiáng)制轉(zhuǎn)換成int型。⑥(int)x%(int)y等于1。⑦(float)(a+b)/2+(int)x%(int)y等于2.5+1.0,結(jié)果為3.5(雙精度型)。(3)inti=3;floatf=1.0;doubled=2.3;計(jì)算10+′a′+i*f-d①③②④①′a′轉(zhuǎn)換成97,10+′a′等于107。②i,f轉(zhuǎn)換成雙精度型,i*f等于3.0。③107轉(zhuǎn)換成雙精度型,10+′a′+i*f等于110.0。④10+′a′+i*f-d等于107.7。3.2算術(shù)表達(dá)式1.自增運(yùn)算
自增運(yùn)算符:++
自增運(yùn)算是單目運(yùn)算,操作數(shù)只能是整型變量,有前置、后置兩種方式:++i,在使用i之前,先使i的值增加1,俗稱先增后用。
i++,先使用i的值,然后使i的值增加1,俗稱先用后增。如:i=1999;j=++i;/*先將i的值增1,變?yōu)?000,后使用。j的值也為2000*/j=i++;/*先使用,j的值為1999。后增,將i的值增1,變?yōu)?000*/
自增運(yùn)算優(yōu)先級處于第2級,結(jié)合自右向左。
2.自減運(yùn)算
自減運(yùn)算符:--
自減運(yùn)算與自增運(yùn)算一樣也是單目運(yùn)算,操作數(shù)也只能是整型變量。同樣有前置、后置兩種方式:--i,在使用i之前,先使i的值減1,俗稱先減后用。
i--,先使用i的值,然后使i的值減1,俗稱先用后減。如:i=2000;j=--i;/*先減,將i的值減1,變?yōu)?999。后使用,j的值也為1999*/j=i--;/*先使用,j的值為2000。后減,將i的值減1,i的值變?yōu)?999*/自減運(yùn)算的優(yōu)先級、結(jié)合性同自增運(yùn)算。
請?zhí)貏e注意:(1)自增、自減運(yùn)算只能用于整型變量,不能用于常量或表達(dá)式。
(2)自增、自減運(yùn)算比等價(jià)的賦值語句生成的目標(biāo)代碼更高效。
(3)該運(yùn)算常用于循環(huán)語句中,使循環(huán)控制變量自動(dòng)加、減1,或用于指針變量,使指針指向下一個(gè)或上一個(gè)地址。
(4)表達(dá)式中包含有自增、自減運(yùn)算時(shí),容易出錯(cuò),務(wù)請小心。如:i=1;
(++i)+(++i)+(++i)的值為多少呢?有的計(jì)算出9(=2+3+4),其實(shí)這是錯(cuò)誤的。計(jì)算時(shí)先對整個(gè)表達(dá)式掃描,i先自增3次,由1→2→3→4,如此計(jì)算結(jié)果為4+4+4,等于12。(i++)+(i++)+(i++)的值又是多少呢?類似上面分析,應(yīng)為3,當(dāng)然表達(dá)式計(jì)算完成后i的值同樣改變?yōu)?。3.運(yùn)算符的組合問題
C語言的運(yùn)算符一般為一個(gè)字符,有的由兩個(gè)字符組成,在表達(dá)式中出現(xiàn)多個(gè)字符時(shí)如何組合呢?C編譯系統(tǒng)在處理時(shí)原則上盡可能自左而右將若干字符組合成一個(gè)運(yùn)算符,標(biāo)識符、關(guān)鍵字也按同樣的原則進(jìn)行處理。如i+++j,解釋為(i++)+j,非i+(++j)。如要表示i+(++j),必須加括號。例3–2
自增自減運(yùn)算。/*程序3-2,自增自減運(yùn)算*/#include″stdio.h″main(){inti,j;i=j=5;printf(″i++=%d,j--=%d\n″,i++,j--);printf(″++i=%d,--j=%d\n″,++i,--j);printf(″i++=%d,j--=%d\n″,i++,j--);printf(″++i=%d,--j=%d\n″,++i,--j);printf(″i=%d,j=%d\n″,i,j);}運(yùn)行結(jié)果:i++=5,j--=5++i=7,--j=3i++=7,j--=3++i=9,--j=1i=9,j=13.3賦值表達(dá)式3.3.1賦值運(yùn)算
賦值運(yùn)算符:=
賦值運(yùn)算是雙目運(yùn)算,一個(gè)操作數(shù)為變量,一個(gè)操作數(shù)為表達(dá)式。賦值運(yùn)算符的右邊是表達(dá)式,左邊是變量。賦值運(yùn)算時(shí)先計(jì)算右邊表達(dá)式的值,然后將右邊表達(dá)式的值賦給左邊變量,即送給左邊變量對應(yīng)的存儲單元,并以此作為整個(gè)賦值表達(dá)式的值。
如:inti;i=3+5%2;/*先計(jì)算3+5%2,得到4,然后將4賦給i*/。賦值運(yùn)算的優(yōu)先級為第14級,次低,結(jié)合自右向左。賦值運(yùn)算中的表達(dá)式操作數(shù)最簡單的形式是一個(gè)常量,這時(shí)讓變量得到一個(gè)初值。如:inti;floatx;charch;i=100;x=12.345;ch=′A′;
賦值運(yùn)算中表達(dá)式操作數(shù)又可以是賦值表達(dá)式,如此可輾轉(zhuǎn)賦值。如:intx,y,z;x=y=z=0.0;/*相當(dāng)于x=(y=(z=0.0)),x、y、z都得到值0*/③②①3.3.2賦值類型轉(zhuǎn)換
(1)將實(shí)型數(shù)據(jù)賦給整型變量時(shí),舍棄實(shí)數(shù)的小數(shù)部分。如:inti;i=1.23;/*結(jié)果i的值為1*/(2)將整型數(shù)據(jù)賦給單、雙精度型變量時(shí),數(shù)值大小不變,但以浮點(diǎn)形式存儲到變量中。(3)將字符型數(shù)據(jù)賦給整型變量時(shí),由于字符數(shù)據(jù)只占一個(gè)字節(jié),而整型變量為兩個(gè)字節(jié),將字符的數(shù)據(jù)放整型變量的低8位,而對整型變量的高8位進(jìn)行擴(kuò)充。
(4)將基本整型數(shù)據(jù)賦給長整型變量時(shí),基本整型數(shù)據(jù)放長整型變量低16位,高16位用符號位擴(kuò)充。反之將長整型數(shù)據(jù)賦給整型變量時(shí),只需將長整型數(shù)據(jù)的低16位原封不動(dòng)送整型變量中。例如:①inti=-1;longintj;j=i;i的二進(jìn)制形式:1111111111111111j的二進(jìn)制形式:11111111111111111111111111111111②longinti=-1;intj;j=i;i的二進(jìn)制形式:11111111111111111111111111111111j的二進(jìn)制形式:1111111111111111(5)將無符號整型數(shù)據(jù)賦給長整型變量時(shí),不存在符號擴(kuò)展的問題,只需將高位補(bǔ)0即可。將無符號整型數(shù)據(jù)賦給一個(gè)占字節(jié)數(shù)相同的整型變量時(shí),將無符號整型數(shù)據(jù)原樣送整型變量中,并將最高位當(dāng)作符號位,如果數(shù)據(jù)超出相應(yīng)的整型范圍,將產(chǎn)生數(shù)據(jù)錯(cuò)誤。如果將整型數(shù)據(jù)賦給占字節(jié)數(shù)相同的無符號整型變量,也是原樣照賦,最高位作數(shù)值處理。例如:①unsignedinti=65535;intj;j=i;/*j的值為-1*/②inti=-1;unsignedintj;j=i;/*i的值為65535*/
3.3.3復(fù)合賦值運(yùn)算
在基本賦值運(yùn)算符“=”之前加上任一雙目算術(shù)運(yùn)算符及位運(yùn)算符可構(gòu)成復(fù)合賦值運(yùn)算符,又稱帶運(yùn)算的賦值運(yùn)算符。算術(shù)復(fù)合賦值運(yùn)算符:+=、-=、*=、/=、%=
位復(fù)合賦值運(yùn)算符:&=、|=、^=、>>=、<<=
一般形式:變量☆=表達(dá)式等價(jià)于:變量=變量☆表達(dá)式☆代表任一雙目算術(shù)運(yùn)算符或位運(yùn)算符。復(fù)合賦值運(yùn)算先進(jìn)行所帶運(yùn)算,再進(jìn)行賦值運(yùn)算。復(fù)合賦值運(yùn)算的優(yōu)先級同賦值運(yùn)算。(1)inta=3;a+=2等價(jià)于a=a+2(2)floatx=1.2,y=2.1;y*=x+3.4等價(jià)于y=y*(x+3.4)(3)inta=1,b=2;b/=a+=1,等價(jià)于b=b/(a=a+1)例3–3
賦值運(yùn)算。/*程序3-3,賦值運(yùn)算*/#include″stdio.h″main(){inti,j;floatx,y;i=j=1;x=y=1.1;printf(″i=%d,j=%d\n″,i,j);x=i+j;y+=1;printf(″x=%4.2f,y=%4.2f\n″,x,y);i=i+++j;x=2*x+y;printf(″i=%d,x=%4.2f\n″,i,x);}運(yùn)行結(jié)果:i=1,j=1x=2.00,y=2.10i=2,x=6.103.4邏輯表達(dá)式3.4.1關(guān)系表達(dá)式
關(guān)系表達(dá)式是邏輯表達(dá)式中的一種特殊情況,關(guān)系表達(dá)式由關(guān)系運(yùn)算符和操作數(shù)組成,關(guān)系運(yùn)算用于完成數(shù)的比較運(yùn)算。關(guān)系運(yùn)算有<、<=、==、!=、>、>=,<、<=、>、>=的優(yōu)先級相同,==、!=的優(yōu)先級相同,前者的優(yōu)先級高于后者。關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算,高于邏輯運(yùn)算&&、||,也高于賦值運(yùn)算。
邏輯表達(dá)式由邏輯運(yùn)算符和關(guān)系表達(dá)式或邏輯量組成,邏輯表達(dá)式用于程序設(shè)計(jì)中的條件描述。
C語言有!、&&、||等三種邏輯運(yùn)算。!運(yùn)算的優(yōu)先級高于算術(shù)運(yùn)算,&&運(yùn)算高于||運(yùn)算,&&、||運(yùn)算低于關(guān)系運(yùn)算,高于賦值運(yùn)算。3.4.2邏輯表達(dá)式&&和||是一種短路運(yùn)算。所謂短路運(yùn)算,是指在計(jì)算的過程中,只要表達(dá)式的值能確定,便不再計(jì)算下去
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年集體土地租賃修建公園協(xié)議
- 2024年陜西省規(guī)范化離婚合同范本一
- 2025年度大巴車租賃合同(含車輛改裝服務(wù))2篇
- 2025年度智能家電產(chǎn)品全國銷售總代理協(xié)議3篇
- 2024年門店合規(guī)與法律風(fēng)險(xiǎn)管理合同
- 重癥監(jiān)護(hù)及ICU護(hù)理質(zhì)量控制
- 2024瓷磚直銷協(xié)議范本版B版
- 2024年版美食廣場聯(lián)營合同
- 2024年精裝修浴室工程承包合同版B版
- 2024短期財(cái)務(wù)周轉(zhuǎn)貸款協(xié)議范本一
- 中醫(yī)診療技術(shù)操作規(guī)程
- 樂理知識考試題庫130題(含答案)
- 2024年《多媒體技術(shù)與應(yīng)用》 考試題庫及答案
- (完整)北京版小學(xué)英語1至6年級詞匯(帶音標(biāo))
- 終止合同告知函 委婉
- 0-3歲嬰幼兒基礎(chǔ)護(hù)理智慧樹知到期末考試答案章節(jié)答案2024年杭州師范大學(xué)
- 面包烘焙原料供應(yīng)采購合同案例
- 工商企業(yè)管理畢業(yè)論文范文(篇一)
- 基于mRNA-LNP技術(shù)的(細(xì)胞)免疫治療產(chǎn)品開發(fā)指南
- 電動(dòng)叉車充電區(qū)安全規(guī)程
- 手術(shù)室中心吸引突然停止的應(yīng)急預(yù)案
評論
0/150
提交評論