C語言程序設(shè)計ppt-第2章_第1頁
C語言程序設(shè)計ppt-第2章_第2頁
C語言程序設(shè)計ppt-第2章_第3頁
C語言程序設(shè)計ppt-第2章_第4頁
C語言程序設(shè)計ppt-第2章_第5頁
已閱讀5頁,還剩110頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C語言與程序設(shè)計

TheCProgrammingLanguage

第2章基本詞法語法規(guī)則與程序元素

華中科技大學計算機學院

盧萍2/4/20231華中科技大學計算機學院第2章

基本詞法語法規(guī)則與程序元素

C程序是一個字符序列,字符序列先被分解為稱之為記號(token)的詞法元素,再根據(jù)語法規(guī)則檢查這些記號組合是否合法。本章首先介紹詞法元素和語法規(guī)則的概念,然后詳盡地討論組成C程序的基本元素,包括基本數(shù)據(jù)類型、常量和變量、運算符、表達式等。2/4/20232華中科技大學計算機學院2.1字符及詞法元素2.1.1字符集

C源程序由字符序列構(gòu)成,其字符集為:英文字母:a~z和A~Z數(shù)字字符:0~9特殊字符:!“#%&‘()*+,-./:

;<>=?[]\^_{}|~空白字符:空格、換行符、水平制表符(HT)、

垂直制表符(VT)、換頁符(FF)2/4/20233華中科技大學計算機學院三字符序列以兩個連續(xù)問號開頭(教材表2-1)。所有的三字符序列都要用相應(yīng)的單個字符替換,這種替換發(fā)生在其他任何處理之前。例如,

inta??(4??)=??<0??>;被替換成

inta[4]={0};2/4/20234華中科技大學計算機學院2.1.2詞法元素詞法元素稱為記號,記號是程序中具有語義的最基本組成單元。記號共分5類:標識符、關(guān)鍵字、常量、運算符和標點符號。編譯器從左至右收集字符,總是盡量建立最長的記號,即使結(jié)果并不構(gòu)成有效的C語言程序。相鄰記號可以用空白符或注釋語句分開。2/4/20235華中科技大學計算機學院詞法分析舉例例2.1sum=x+y

分解成sum、=、x、+和y共5個記號。例2.2inta,b=10,

分解成int、a、,、b、=、10和;共7個記號例2.3x+++++y

分解成x、++、++、+、y共5個記號2/4/20236華中科技大學計算機學院2.2語法規(guī)則如何描述計算機語言的語法規(guī)則?2.2.1BNF(Backus-NaurForm)范式

BNF:巴科斯范式是由JohnBackus和PeterNaur首先引入的用來描述計算機語言語法的符號集。

現(xiàn)在,幾乎每一位新編程語言書籍的作者都使用巴科斯范式來定義編程語言的語法規(guī)則。

2/4/20237華中科技大學計算機學院

BNF范式的符號尖括號(<>)內(nèi)包含的為必選項。

豎線(|)表示在其左右兩邊任選一項,相當于“OR”的意思。::=是“被定義為”的意思。2/4/20238華中科技大學計算機學院BNF范式示例--標識符的BNF范式

<標識符>::=<字母>|<標識符><字母數(shù)字>

<字母數(shù)字>::=<字母>|<數(shù)字>

<字母>::=_|<大寫字母>|<小寫字母><小寫字母>::=a|b|c|d|…|z

<大寫字母>::=A|B|C|D|…|Z<數(shù)字>::=0|1|2|3|4|5|6|7|8|92/4/20239華中科技大學計算機學院2.2.2EBNF

EBNF是BNF的一種擴充。EBNF中符號有:{}:括起來的部分重復0次或多次。[]:括起來的部分出現(xiàn)0次或1次。():表示結(jié)成一組。

標識符的EBNF范式:<標識符>::=<字母>{<字母數(shù)字>}2/4/202310華中科技大學計算機學院2.2.3語法圖語法圖是另一種表示語法的常見方式。標識符的語法圖a…z,A…z,_0…9,a...z,A...z,_2/4/202311華中科技大學計算機學院2.3標識符、關(guān)鍵字及分隔符2.3.1標識符標識符是用來標識用戶定義的常量、變量、數(shù)據(jù)類型和函數(shù)等名字的符號。其命名規(guī)則:

以一個字母(a~z,A~Z)或下劃線(_)開頭,后跟字母、下劃線或數(shù)字(0~9)例:K,_id,month,time1

20_sum,not#me

2/4/202312華中科技大學計算機學院注意大小寫字母表示不同意義。不能使用類似int和void這樣的C關(guān)鍵字為自己的對象命名,也要避免使用C程序庫中函數(shù)和常量的名稱,例如scanf。良好的編程風格是選擇有助于記憶且有一定含義的標識符,這樣可增強程序的可讀性和程序的文檔性。2/4/202313華中科技大學計算機學院2.3.2關(guān)鍵字是被系統(tǒng)賦予特定含義并有專門用途的標識符,不能作為普通標識符,但可以作為宏名。見教材表2.22/4/202314華中科技大學計算機學院2.3.3分隔符分隔符統(tǒng)稱為空白字符(包括空格符、制表符、換行符、換頁符及注釋符),在語法上僅起分隔單詞的作用。當程序中兩個相鄰的單詞之間如果不用分隔符就不能區(qū)分開時則必須加分隔符(通常用空格符)。例如,intx,y;不能寫成intx,y;能寫成intx,y;2/4/202315華中科技大學計算機學院2.4基本數(shù)據(jù)類型2.4.1數(shù)據(jù)類型的分類數(shù)據(jù)類型導出類型指針類型空類型(無值類型)數(shù)組類型結(jié)構(gòu)類型聯(lián)合類型

基本類型整型字符型浮點型復數(shù)類型整型布爾型枚舉類型2/4/202316華中科技大學計算機學院2.4.2基本類型的名字本小節(jié)介紹字符型、整型、浮點型(表2.4)charintfloatunsignedsigned

short(short,unsignedshort)floatdoublelongdouble

long(long,unsignedlong)2/4/202317華中科技大學計算機學院2.4.3字符類型charchar的存儲長度是一字節(jié)。多數(shù)系統(tǒng)中char與signedchar同(-128~127).字符數(shù)據(jù)以ASCII碼存儲在內(nèi)存中。在不要求大整數(shù)的情況下,可用字符型代替整型。2/4/202318華中科技大學計算機學院2.4.4整型類型int型值存儲在一個機器字中.假設(shè)字長為2B,int取值范圍為-32768~32767,

unsigned取值范圍為0~65535

下面的代碼是否正確#defineBIG30000intmain(void){shortx,y,z;x=y=BIG;z=x+y;/*短整數(shù)溢出*/……}2/4/202319華中科技大學計算機學院程序員必須時刻保證整數(shù)表達式的值在合理范圍內(nèi)。引入short和long的目的是為了提供各種滿足實際要求的不同長度的整數(shù)。int通常反映特定機器的自然大小,short一般為2B,long一般為4B。因此,當關(guān)心存儲時,用short;當需要較大的整數(shù)值時,用long。2/4/202320華中科技大學計算機學院2.4.5浮點類型一個浮點數(shù)N可表示為:-10.0=-0.101*24=數(shù)符1b指數(shù)8b尾數(shù)23b11000001001000…02/4/202321華中科技大學計算機學院尾數(shù)所占的位數(shù)決定值的精度,指數(shù)所占的位數(shù)決定值的范圍。float占4B,其中符號1b,指數(shù)8b,尾數(shù)23b,其精度大約為7位,范圍約10-38~10+38。double占8B,其中符號1b,指數(shù)11b,尾數(shù)52b,其精度大約為15位,范圍約為10-308~10+308。很多編譯器將longdouble處理為double,在某些系統(tǒng)中,它占用10或12B。很少被使用。2/4/202322華中科技大學計算機學院浮點數(shù)的表示可能只是近似的。其值與表示法之間的差稱為“可表示誤差”。計算也可能造成可表示誤差。不能使用==和!=運算符比較浮點數(shù)據(jù)??梢杂脙蓚€數(shù)值之差同一個預(yù)定的小正數(shù)epsilon比較的方法解決這個問題。2/4/202323華中科技大學計算機學院浮點數(shù)溢出的處理下溢時,保存一個非規(guī)則化數(shù)值,即指數(shù)域全為0,對應(yīng)的階碼E是126而不是127,尾數(shù)域非0,對應(yīng)的尾數(shù)M小于1且大于0,因此,不再加上高位的1,而是還原為0.xxxxxx,這樣做是為了表示0,以及接近于0的很小的數(shù)字。當指數(shù)域和尾數(shù)域全0,這個數(shù)是0。上溢時,用稱為“無窮大”的特殊位模式表示,即指數(shù)域全為1,尾數(shù)域0。有些系統(tǒng)中將輸出+Infinity或Infinity表示上溢的數(shù)據(jù);指數(shù)域全為1,尾數(shù)域非0,表示這個數(shù)不是一個數(shù)(NaN)。程序員必須能識別本地編譯器和系統(tǒng)的上溢和下溢值,能識別并修正造成溢出的錯誤運算。2/4/202324華中科技大學計算機學院2.5常量與變量2.5.1文字常量1.整型常量

有三種表示方法(通過前綴字符區(qū)分):十進制:無前綴八進制:前綴為0十六進制:前綴為0x或0X時。

例如,31可寫成037,也可寫成0x1f或0X1F2/4/202325華中科技大學計算機學院整型常量可以帶有后綴,用以指定其類型:字母u或U表示unsigned字母l或L表示long字母ul或UL表示unsignedlong字母ll或LL表示longlong(C99)字母ull或ULL表示unsignedlonglong(C99)無后綴時,表示int當常量值超出指定類型的范圍時,其實際類型取決于數(shù)值大小、前綴等,確定類型的規(guī)則很復雜,在標準化前的C語言、C89和C99中各不相同2/4/202326華中科技大學計算機學院2.浮點型常量

有兩種表示方式:(1)帶小數(shù)點的十進制數(shù)形式(可以小數(shù)點開頭,也可以小數(shù)點結(jié)尾)

如23.7,14.,.126(2)指數(shù)形式(科學計數(shù)法)

將指數(shù)部分跟在尾數(shù)部分后面。尾數(shù)部分的書寫規(guī)則與第一種相同,但可以沒有小數(shù)點,指數(shù)部分e(E)±n,代表10±n。

如45e-3=4510-3,.15e5=0.15105。2/4/202327華中科技大學計算機學院

可以使用后綴來指定其類型無后綴:double,后綴f或F:float,后綴l或L:longdouble。2/4/202328華中科技大學計算機學院3.字符常量(1)用單引號包含的一個字符是字符常量(2)只能包含一個字符例‘a(chǎn)’,’A’,‘1’‘a(chǎn)bc’、“a”2/4/202329華中科技大學計算機學院轉(zhuǎn)義序列以\開頭的特殊字符稱為轉(zhuǎn)義序列,有兩種形式:一種是“字符轉(zhuǎn)義序列”,即反斜線后面跟一個圖形符號,用于表示字符集中的非圖形符號和一些特殊的圖形字符。\n換行\(zhòng)t水平制表符\\反斜杠\‘單引號\“雙引號\0空字符

\?問號\源程序\ex2_4.c2/4/202330華中科技大學計算機學院轉(zhuǎn)義序列的另一種是“數(shù)字轉(zhuǎn)義序列”,即\ooo(1~3個八進制數(shù)字)

\xhh(1~2個十六進制數(shù)字)例如,'A'、'\101'和'\x41'字符A;'\t'、'\11'、'\011'、'\x9'和'\x09'水平制表符2/4/202331華中科技大學計算機學院4.字符串常量寫成用一對雙引號括住0至多個字符的形式。

"string\n"/*包含7個字符的字符串*/""/*包含0個字符的空字符串*/字符串中的單引號可以用圖形符號表示,但雙引號和反斜線必須用轉(zhuǎn)義序列表示。例如:"3'40\""/*表示5個字符的字符串:3'40"*/“c:\tc”/*表示4個字符的字符串*/“c:\\tc”/*表示5個字符的字符串*/2/4/202332華中科技大學計算機學院如何將一個較長的字符串寫成多行?

有兩種方法:(1)行連接:在前一行的末尾輸入續(xù)行符(\)再換行。

"Hello,\

howareyou“/*換行后應(yīng)緊靠行首*/(2)字符串連接:將字符串分段,分段后的每個字符串用雙引號括起來。

"Hello,"

"howareyou"/*換行后不必緊靠行首*/2/4/202333華中科技大學計算機學院‘a(chǎn)’與“a”有何區(qū)別?‘a(chǎn)’:字符常量,占1B內(nèi)存空間“a”:字符串常量,占2B內(nèi)存空間存儲時,系統(tǒng)自動在后面補上\0(空字符,ASC11值為0,作為字符串結(jié)束標志)字符串的存儲長度比字符串的實際長度大1

\源程序\ex2_5.c

a

\0

2/4/202334華中科技大學計算機學院2.5.2符號常量用一個標識符表示一個常量.C語言中有三種定義符號常量的方法:(1)用#define指令(2)用const聲明語句(3)用枚舉類型(在2.9節(jié)介紹)2/4/202335華中科技大學計算機學院1.用#define定義符號常量#define是一種編譯預(yù)處理指令,格式為:

#define標識符常量符號常量(一般用大寫,以區(qū)分變量)2/4/202336華中科技大學計算機學院例2.6打印華氏和攝氏溫度對照表,

溫度轉(zhuǎn)換公式為:℃=(5/9)(℉-32)

\源程序\ex2_6.c

2/4/202337華中科技大學計算機學院2.用const定義符號常量const是關(guān)鍵字,稱為類型限定符。格式為:

const類型名標識符=常量;例如:constdoublePI=3.14159;constintDOWN=0x5000;/*下光標鍵的掃描碼*/constintYES=1,NO=0;2/4/202338華中科技大學計算機學院用const和#define定義的符號常量的區(qū)別?const聲明的標識符是一個只讀變量,編譯時系統(tǒng)會根據(jù)定義的類型為該標識符分配存儲單元,并把對應(yīng)的常量值放入其中,該值不能再被更改,此后,程序中每次出現(xiàn)該標識符都是對所代表存儲單元的訪問。#define定義的標識符沒有對應(yīng)的存儲單元,只是在編譯之前由預(yù)處理程序進行簡單的文本替換。2/4/202339華中科技大學計算機學院2.5.3變量定義變量代表內(nèi)存中具有特定屬性的一個存儲單元,它用來存放數(shù)據(jù),這就是變量的值,在程序運行期間,這些值是可以改變的。2/4/202340華中科技大學計算機學院要求對所有用到的變量作定義,也就是“先定義,后使用”。類型名變量表;

inttotal,average;變量在聲明時可以同時賦一個初值(稱為變量的顯示初始化),每個變量必須分別顯示初始化。intcount=0,sum=0;charalert=‘\a’,c;intcount=0,sum=0;(不能intcount=sum=0;)2/4/202341華中科技大學計算機學院2.6運算符和表達式運算符是運算的符號表示,執(zhí)行對運算對象(稱為操作數(shù))的各種操作。單個的操作數(shù)(包括常量、變量和函數(shù)調(diào)用)是表達式,由運算符和操作數(shù)組成的有意義的計算式子更是表達式,如:sqrt(b*b-4*a*c)x=x*PI/180fabs(an)>=EPS2/4/202342華中科技大學計算機學院2.6.1C運算符簡介學習每一種運算符都應(yīng)掌握以下四點:(1)運算符的運算功能(2)操作數(shù)的個數(shù)和類型要求單目(或一元)運算符雙目(或二元)運算符三目(或三元)運算符運算符都對操作數(shù)的類型有規(guī)定,比如%的操作數(shù)不能為浮點型。2/4/202343華中科技大學計算機學院(3)運算符的優(yōu)先級和結(jié)合性(4)運算所得結(jié)果的類型運算的結(jié)果是一個具有確定類型的值,這個類型稱為表達式值的類型。尤其當兩個不同類型的操作數(shù)進行運算時,會引起數(shù)據(jù)類型的轉(zhuǎn)換,特別要注意結(jié)果值的類型。2/4/202344華中科技大學計算機學院2.6.2運算符的優(yōu)先級和結(jié)合性當表達式中包括多個運算符時,C語言會先按優(yōu)先級規(guī)則解釋表達式的意義。如:

1+2*3等價于1+(2*3)當一個操作數(shù)兩側(cè)的運算符優(yōu)先級別相同時,則按“結(jié)合性”規(guī)則。

1+2-3等價于(1+2)-3---從左至右的結(jié)合性(左結(jié)合)2/4/202345華中科技大學計算機學院

-a++等價于-(a++)

----從右至左的結(jié)合性(右結(jié)合)所有運算符的優(yōu)先級和結(jié)合性規(guī)則見表2.62/4/202346華中科技大學計算機學院2.6.3算術(shù)運算運算符:+

加法正值3+6,+3–減法負值6–4,–5乘法38/除法8/5%求余7%4值為32/4/202347華中科技大學計算機學院注:兩個整型數(shù)據(jù)相除

(結(jié)果為整,舍去小數(shù)部分)

–5/3–1

1/20

1./20.5

使用時千萬注意int/int出現(xiàn)數(shù)據(jù)丟失。%操作數(shù)必需為整數(shù)2/4/202348華中科技大學計算機學院【例2.7】求出所有的水仙花數(shù)?!八苫〝?shù)”是一個三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是一個“水仙花數(shù)”,因為153=13+53+33。找出“水仙花數(shù)”的關(guān)鍵是怎樣從一個三位數(shù)中分離出百位數(shù)、十位數(shù)和個位數(shù),分解方法見下面的代碼。\源程序\ex2_7.c2/4/202349華中科技大學計算機學院2.6.4關(guān)系運算有6個關(guān)系運算符:>大于

>=大于等于

<小于

<=小于等于

==等于

!=不等于2/4/202350華中科技大學計算機學院關(guān)系表達式的類型:int關(guān)系表達式的值:關(guān)系成立,值為1(代表“真”)關(guān)系不成立,0(代表“假”)2/4/202351華中科技大學計算機學院舉例根據(jù)變量說明,給出表達式的值。

intx=4,y=3,z=2;charc='a';(1)c=='A'+32(1)(2)c+1!='b'(0)(3)x-y<=10(1)(4)z=x>y(1)(5)x>y>z(0)2/4/202352華中科技大學計算機學院注意數(shù)學上判斷x是否在區(qū)間[a,b]中時,習慣寫成:a<x<bC中“a<x<b”的含義與數(shù)學中的含義不同,應(yīng)寫成:

a<x&&x<b2/4/202353華中科技大學計算機學院常見的C語言編程錯誤將運算符==寫成運算符=(賦值)??赡軙驗檫\行時的邏輯錯誤而導致不正確的結(jié)果。例如,if(grade=='A')printf("VeryGood!");

/*當成績的等級為A等時,輸出VeryGood!*/而:if(grade='A')printf("VeryGood!");

/*不論成績的等級是幾等,總輸出VeryGood!*/2/4/202354華中科技大學計算機學院

2.6.5邏輯運算有3個邏輯運算符

!

邏輯非&&邏輯與

||

邏輯或邏輯表達式:用邏輯運算符將關(guān)系表達式或邏輯量連接起來的式子2/4/202355華中科技大學計算機學院邏輯運算的操作數(shù)可以是0和任何非0的數(shù)值,系統(tǒng)最終以0判斷屬于“假”(以0代表“假”),以非0判斷屬于“真”(以1代表“真”)。邏輯表達式的值:1(“真”)

0(“假”)

邏輯表達式的類型:int2/4/202356華中科技大學計算機學院&&和||的真值表e1e2&&||00000非001非0001非0非0112/4/202357華中科技大學計算機學院!的真值表e!01非002/4/202358華中科技大學計算機學院注意編譯程序在處理含有&&、||表達式時,往往采用優(yōu)化算法(提高速度)。

e1&&e2一旦發(fā)現(xiàn)e1=0,不再計算e2

e1||e2一旦發(fā)現(xiàn)e1=1,不再計算e2例如,

x>=0.0&&sqrt(x)<=7.7/*如果x值為負,不求x的平方根*/2/4/202359華中科技大學計算機學院熟練掌握C語言的關(guān)系運算符和邏輯運算符后,可以巧妙地表示一個復雜的條件。(1)整數(shù)a是偶數(shù)

!(a%2)或a%2==0

(2)字符c的值是英文字母。

c>='a'&&c<='z'||c>='A'&&c<='Z'

(3)某一年year是閏年。如果某一年的年份能被4整除但不能被100整除,那么這一年就是閏年,此外,能被400整除的年份也是閏年。

!(year%4)&&year%400||!(year%400)2/4/202360華中科技大學計算機學院2.6.6自增和自減運算

++:自增,使內(nèi)存中存儲的變量值加1

--:自減,使內(nèi)存中存儲的變量值減1++和--的奇特之處:前綴式和后綴式都行

++xx++相當于x=x+1;--xx--相當于x=x-1;

2/4/202361華中科技大學計算機學院注意前綴與后綴的區(qū)別x=10;y=++x;/*y=11,x=11*/----先執(zhí)行對操作數(shù)的加運算,再使用該操作數(shù)的值y=x++/*y=10,x=11*/----先使用該操作數(shù)的值,再對它作加運算,2/4/202362華中科技大學計算機學院【例2.11】統(tǒng)計輸入正文的字符數(shù)和行數(shù)正文是一行行字符組成的字符序列,每一行是以換行符為結(jié)束標志的一串字符,輸入正文以Ctrl+Z(DOS系統(tǒng))或Ctrl+D(UNIX系統(tǒng))為結(jié)束標志(稱為文件尾)。輸入一個字符可以使用標準庫函數(shù)getchar。getchar遇文件結(jié)束標志時返回EOF,EOF是在頭文件<stdio.h>定義的符號常量,其值為-1。\源程序\ex2_11.c2/4/202363華中科技大學計算機學院【例2.12】計算1+2+3+…+n,n從鍵盤輸入\源程序\ex2_12.c2/4/202364華中科技大學計算機學院序列點后綴++(或--)計算延遲的終止點稱為序列點。在序列點之前,用原值,序列點之后,該操作數(shù)是更改后的新值。下列條件出現(xiàn)序列點:(1)&&、||、?:或,運算符,即這些運算符的第一個操作數(shù)之后(2)完整表達式結(jié)束時,即表達式語句、return語句中的表達式、if、switch或循環(huán)語句中的條件表達式(包括for語句中的每個表達式)之后2/4/202365華中科技大學計算機學院【例2.13】后綴式++(或--)表達式舉例

inta=1,b=0;

(1)b+++b++

表達式值為0,b為2

(2)a--&&a

表達式值為0,a為0

(3)b++?b:-b

表達式值為-1,b為12/4/202366華中科技大學計算機學院幾點注意:1.只能用于變量(即左值表達式).

5++,(a+b)--均不合法.2.結(jié)合性為從右至左.如–i++相當于–(i++)

若i=3,則該表達式結(jié)果為–3,i為42/4/202367華中科技大學計算機學院2.6.7賦值運算1.簡單的賦值運算賦值運算符:=

賦值表達式一般形式為:

<變量>=<表達式>

右側(cè)的“表達式”的值賦給左側(cè)的變量

左值(lvalue)

:賦值運算符左側(cè)的標識符變量可以作為左值而表達式就不能作為左值(如a+b)

常量也不能作為左值

2/4/202368華中科技大學計算機學院賦值表達式的值和類型與左操作數(shù)的值和類型相同。C把賦值處理為運算符,其好處是使賦值表達式可以像其它任何表達式一樣當作一個數(shù)據(jù)來處理。如a=2;b=3;x=a+b;可以被簡化為x=(a=2)+(b=3)2/4/202369華中科技大學計算機學院賦值運算符的結(jié)合性右結(jié)合性,如

a=b=c=3;

等價于

a=(b=(c=3));2/4/202370華中科技大學計算機學院

2.復合的賦值運算在“=”號之前加一個雙目運算符:

+=,-=,*=,/=,%=如i+=2等價于i=i+2y/=x+10等價于y=y/(x+10)x*=k=m+5等價于x=x*(k=m+5)s[i++]+=1和s[i++]=s[i++]+1不等價2/4/202371華中科技大學計算機學院

2.6.8條件運算

e1?e2:e3e1e2e3真(非0)假(0)2/4/202372華中科技大學計算機學院舉例1)

x=10;y=x>9?100:200/*y:100*/(2)x=a>0?1:a<0?-1:0

等價于(因為是右結(jié)合性)x=a>0?1:(a<0?-1:0)2/4/202373華中科技大學計算機學院

2.6.9逗號運算

e1,e2計算規(guī)則:先計算e1,再計算e2,逗號表達式的值和類型與e2的值和類型相同2/4/202374華中科技大學計算機學院舉例(1)x=(i=4,i%3)

表達式的值為:1,x為1(2)x=i=4,i%3

表達式的值為:1,x為42/4/202375華中科技大學計算機學院擴展形式逗號表達式的一般形式可以擴展為

e1,e2,e3,……,en它的值為表達式n的值。2/4/202376華中科技大學計算機學院

注意并不是任何地方出現(xiàn)的逗號都是作為逗號運算符。例如函數(shù)參數(shù)也是用逗號來間隔的。

printf(“%d,%d”,2,3);/*輸出:2,3*/printf(“%d,%d”,(2,3),3);/*輸出:3,3*/“(2,3)”是一個逗號表達式,它的值等于3?!?,3”并不是一個逗號表達式,它是printf函數(shù)的2個參數(shù)2/4/202377華中科技大學計算機學院【例2.14】輸入一串數(shù)字字符,將其轉(zhuǎn)換為一個十進制整數(shù)賦值給x(模擬scanf("%d",&x)的功能)。當用scanf("%d",&x)輸入一個整數(shù)時,實際上輸入的是組成該整數(shù)的各位數(shù)字的一個字符串,scanf函數(shù)讀到的每個數(shù)字都是該字符的字符碼。為了將字符串轉(zhuǎn)換為整數(shù),必須先將每個數(shù)字字符轉(zhuǎn)換成數(shù)字對應(yīng)的一位整數(shù),然后按相應(yīng)的數(shù)位拼成一個十進制整數(shù),最后賦給變量x。\源程序\ex2_14.c2/4/202378華中科技大學計算機學院

2.6.10sizeof運算一個單目運算符,有兩種形式:(1)sizeof(類型名)給出指定數(shù)據(jù)類型占用的存儲字節(jié)數(shù)(2)sizeof表達式給出表達式結(jié)果的類型占用的存儲字節(jié)數(shù)2/4/202379華中科技大學計算機學院舉例假設(shè)int類型占用2字節(jié)。sizeof(long)/*值為4*/doublex;sizeofx/*值為8*/inta[10];sizeof(a)/*值為20*/inta=1,b=1;sizeof(a+b)/*值為2,

而sizeofa+b,先求sizeofa,再和b加,

值為3*/2/4/202380華中科技大學計算機學院

sizeof是一個常量表達式其運算是在編譯時執(zhí)行的。因此,當sizeof的操作數(shù)是表達式時,則在編譯時分析表達式以確定類型,運行時不對這個表達式求值。例如:shortx=1;sizeof(++x);/*x不遞增,仍為1*/2/4/202381華中科技大學計算機學院2.7位運算符和位表達式6個位運算符:~(求反)&(按位與)|(按位或)^(按位異或,或按位加)<<(左移)>>(右移)2/4/202382華中科技大學計算機學院2.7.1按位求反(~)對操作數(shù)的每個二進制位取相反值例如:shorta=5;unsignedshortb=5;a和b的二進制為:0000000000000101~a的二進制為:1111111111111010~a的值為short型–6。~b的值為unsignedshort型65530。2/4/202383華中科技大學計算機學院2.7.2按位與、或、加運算(&,|,^)

表達式二進制表示十六進制值說明x01101000110100010x68d1待處理數(shù)據(jù)mask11111111000000000xff00邏輯尺x&mask01101000000000000x6800將x的低字節(jié)置為0,保留高字節(jié)x|mask11111111110100010xffd1將x的低字節(jié)保留,高字節(jié)置為1x^mask10010111110100010x97d1將x的低字節(jié)保留,高字節(jié)翻轉(zhuǎn)2/4/202384華中科技大學計算機學院2.7.3左移和右移運算(<<和>>)e<<n將e的值向左移n位,低n位填入0。

左移1位相當于該數(shù)值乘以2e>>n將e的值向右移n位,而高n位可能填入?。

--e是無符號類型,填入0;

--e是有符號類型,一些機器填入0(即“邏輯移位”),

而另一些機器則填入符號位(即“算術(shù)移位”)。在使用右移運算符時應(yīng)經(jīng)常用無符號類型。右移一位相當于該數(shù)值除以22/4/202385華中科技大學計算機學院移位運算符的例子表達式二進制表示值行為ab-aa<<2b>>3-a>>20000000000001011000000000000111111111111111101010000000000101100000000000000000111111111111111011115-11441-3對a進行負號運算a左移2位b右移3位-a右移2位(填入符號位1,而其他機器可能是0)2/4/202386華中科技大學計算機學院【例2.15】寫一個表達式,取一個整數(shù)x從第m位開始向右的n位,并使其向右端靠齊。一個整數(shù)的各個二進制位從右至左依次編號為第0位、第1位、第2位、……。(1)將要取出的那n位移到最右端

x>>(m-n+1)(2)設(shè)計一個邏輯尺:低n位全為1,其余位全為0~(~0<<n)(3)將上面二者進行&的運算

x>>(m-n+1)&~(~0<<n)2/4/202387華中科技大學計算機學院2.7.4位運算符應(yīng)用舉例【例2.16】壓縮和解壓示例??梢园驯硎?1世紀日期的日、月和年3個整數(shù)壓縮成1個16位的整數(shù)。寫一個表達式,實現(xiàn)壓縮存儲日、月和年。2/4/202388華中科技大學計算機學院分析:可以把表示21世紀日期的日、月和年3個整數(shù)壓縮成1個16位的整數(shù),因為日有31個值,月有12個值,年有100個值,所以可以在一個整數(shù)中用5b表示日,用4b表示月,用7b表示年.

151110760日月年day<<11|month<<7|year2/4/202389華中科技大學計算機學院【例2.17】簡單加密示例。

將一個短整型數(shù)x分成4個長度不等的部分:

A(3b)、B(5b)、C(4b)和D(4b),然后將它們按照CADB的順序重新拼湊在一起,實現(xiàn)對其加密的功能。寫一個表達式,要求其值為x的密文。2/4/202390華中科技大學計算機學院(1)設(shè)計4個邏輯尺,分別用于取出A、B、C和D4個部分。A的邏輯尺應(yīng)設(shè)計成:高3位全為1,其余全為0,即0xE000;B的邏輯尺應(yīng)設(shè)計成:第8~12位全為1,其余全為0,即0x1F00;同理C和D的邏輯尺分別為0x00F0和0x000F。(2)取出A、B、C和D,再移到新位置。將x分別和邏輯尺進行&運算,可取出每一部分。用每部分第1位的初始位置減去其新位置得到移位數(shù),正數(shù)右移,負數(shù)左移。(3)將各部分重新組裝在一起。得到表達式為:(x&0xE000)>>4|(x&0x1F00)>>8|(x&0xF0)<<8|(x&0xF)<<52/4/202391華中科技大學計算機學院2.7.5打印整數(shù)各位的軟件工具

/*按位顯示int*/#include<limits.h>voidbit_print(intx){inti;intn=sizeof(int)*CHAR_BIT;/*CHAR_BIT在limits.h中定義*/intmask=1<<(n-1);/*邏輯尺mask=100……0*/for(i=1;i<=n;++i){putchar(!(x&mask)?'0':'1');x<<=1;if(!(i%CHAR_BIT)&&i<n)putchar('');}}2/4/202392華中科技大學計算機學院2.8類型轉(zhuǎn)換C語言允許雙精度、單精度、整型及字符數(shù)據(jù)之間混合運算10+

'1‘+6.5但有一個規(guī)則:先轉(zhuǎn)換成同一類型,再計算。2/4/202393華中科技大學計算機學院2.8.1整數(shù)提升任何表達式中的char、unsignedchar、short和unsignedshort都要先轉(zhuǎn)換成int或unsigned,如果原始類型的所有值可以用int表示,則轉(zhuǎn)換成int,否則轉(zhuǎn)換成unsigned,把這稱為“整數(shù)提升”。2/4/202394華中科技大學計算機學院2.8.2一般算術(shù)轉(zhuǎn)換char/shortintunsignedlongunsignedlongfloatdoublelongdouble2/4/202395華中科技大學計算機學院2.8.3賦值轉(zhuǎn)換右操作數(shù)的值被轉(zhuǎn)換為左操作數(shù)的類型例如:shorts=5;doubled=2.9;則s=d/*把d轉(zhuǎn)換為short,再賦給s。值為2*/d=s/*把s轉(zhuǎn)換為double,再賦給d。值為5.0*/2/4/202396華中科技大學計算機學院2.8.4強制類型轉(zhuǎn)換

(類型名)操作數(shù)例如,(double)i/*將i轉(zhuǎn)換成double,i的類型保持不變*/(long)(‘a(chǎn)’-32)/*‘a(chǎn)’被自動轉(zhuǎn)換成int,相減的結(jié)果被強制轉(zhuǎn)換為long*/(float)x+y/*等價于((float)x)+y*/(double)x=10/*錯誤*/2/4/202397華中科技大學計算機學院2.9枚舉類型枚舉類型是用戶自定義類型,它是用標識符命名的整型常量的集合,其中的標識符稱為枚舉常量。從效果上看,枚舉常量是自動設(shè)置值的符號常量。2/4/202398華中科技大學計算機學院enumweek{SUN,MON,TUE,WED,THU,FRI,SAT};在未指定值的缺省情況下,第一個枚舉常量的值為0,以后的值依次遞增1.

可以指定一個或多個枚舉常量的值,未指定值的枚舉常量的值比前面的值大1.enumsizes{SMALL,MEDIUM=10,BIG,TOO_BIG=20};

enum后面也可以不出現(xiàn)枚舉名.enum{WIN,LOSE,TIE,ERROR};關(guān)鍵字

枚舉名

枚舉常量

2.9.1枚舉類型的定義2/4/202399華中科技大學計算機學院2.9.2用枚舉類型定義符號常量#defineWIN0#defineLOSE1#defineTIE2#defineERROR-1可用下面的枚舉類型定義來代替。

enum{WIN,LOSE,TIE,ERROR=-1};2/4/2023100華中科技大學計算機學院2.9.3.枚舉變量的聲明(1)在定義枚舉類型的同時說明枚舉變量

enumcolor{RED,GREEN,BLUE}c1,c2;(2)利用枚舉名來說明枚舉變量

enumcolor{RED,GREEN,BLUE}c1;

enumcolorc2;或者

enumcolor{RED,GREEN,BLUE};

enumcolorc1,c2;2/4/2023101華中科技大學計算機學院一個枚舉變量的值是int型整數(shù),但值域僅限于列舉出來的范圍。枚舉變量值的輸入和輸出都只能是整數(shù)。c1=BLUE;/*等價于c1=2;使用有意義的標識符有助于讀者理解程序*/printf(“%d”,c1);/*輸出2,而不是BLUE*/scanf(“%d”,c2);/*輸入0,不能輸入RED*/

下面的語句是錯誤的:c1=3;/*變量c1的值域為:0、1和2*/printf(“%s”,GREEN);/*輸出錯誤的結(jié)果,而不是GREEN*/if(c1==RED)printf(“Red”);2/4/2023102華中科技大學計算機學院【例2.22】用枚舉變量day控制循環(huán),輸出存儲在數(shù)組weekName中的英文星期名。一個枚舉變量的值是一個int整數(shù),它可以出現(xiàn)在整數(shù)允許出現(xiàn)的任何地方。如果要輸出與枚舉值相對應(yīng)的枚舉常量標識符或代表其含義的完整字符串,可以定義一個字符串數(shù)組,以枚舉值作為下標。源程序\ex2_22.c2/4/2023103華中科技大學計算機學院2.10新增數(shù)據(jù)類型C99標準增加了支持64位的整數(shù)類型longlong,還增加了布爾類型和復數(shù)類型。CodeBlocks編譯器能夠較好地支持C99標準,本節(jié)中的例子程序均由CodeBlocks運行通過。2/4/2023104華中科技大學計算機學院2.10.1longlong類型longlong類型的長度至少應(yīng)為64位。和其他整型類型一樣,有帶符號和無符號兩種。signedlonglong的數(shù)值范圍為-263~263-1,unsignedlonglong的數(shù)值范圍為0~264-1。longlong類型的常量用后綴“LL”或“l(fā)l”表示。在所有整型類型中,類型longlong的值域最寬,因此,C99標準的自動轉(zhuǎn)換所遵循的轉(zhuǎn)換方向為:…unsignedlonglong

longunsignedlonglongfloat…2/4/2023105華中科技大學計算機學院【例2.23】輸出斐波那契(FIBONACCI)數(shù)列的前60個數(shù)。FIBONACCI數(shù)列是由1和1開始,之后的數(shù)是它前面兩數(shù)的和,即1,1,2,3,5,8,……分析:由于FIBONACCI數(shù)列從大約第45個數(shù)起就超過了long類型的范圍,為避免溢出,應(yīng)將結(jié)果變量說明為longlong類型,從輸出結(jié)果可以看到,它的長度為8字節(jié)。源程序\ex2_23.c2/4/2023106華中科技大學計算機學院2.10.2布爾類型C語言中可以用任何整數(shù)類型表示布爾值,0表示假,所有非0表示真。布爾表達式為假時值為0,為真時值為1。例如,i=(a<b),在a小于b時對整型變量i賦值1;在a不小于b時對變量i賦值0。C99標準引入了真正的布爾類型_Bool,_Bool類型長度為1,只能保存數(shù)值0和1(分別表示“false”與“true”)。雖然也可以使用其他整數(shù)類型表示布爾值,但如果C語言實現(xiàn)支持C99標準,那么使用_Bool類型更清晰。另外,C99標準為了讓C和C++兼容,增加了一個頭文件stdbool.h。里面定義宏名bool為_Bool的同義詞,定義false與true分別為0和1。因此,只要在源文件中包含stdbool.h這個頭文件,就可以在C語言里像C++那樣使用bool定義布爾類型

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論