第02章基本詞法語法規則與程序元素_第1頁
第02章基本詞法語法規則與程序元素_第2頁
第02章基本詞法語法規則與程序元素_第3頁
第02章基本詞法語法規則與程序元素_第4頁
第02章基本詞法語法規則與程序元素_第5頁
已閱讀5頁,還剩50頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章數據類型、運算符

和表達式C語言程序設計主講教師:祝建華2

《C語言程序設計》是計算機科學與技術類各專業的一門基礎課程。

本章主要介紹表達式,它是程序設計核心內容之一。重點討論了數據類型、運算符和表達式等基本概念以及它們之間的相互關系。核心內容是高級語言單詞的種類與構詞規則、數據分類與數據類型、常量與變量的說明、基本運算與表達式和不同類型數據的轉換規則。內容摘要3重點講解2.1字符及詞法元素2.2語法規則2.3標識符、關鍵字及分隔符2.4基本數據類型2.5常量與變量2.6運算符和表達式2.7位運算和位表達式2.8類型轉換2.9枚舉類型2.10*

新增數據類型小結42.1.1

字符集目錄2.1

字符及詞法元素

按照語言結構的角度,語言表達的基本形式是句子,句子是由單詞依據句法規則構成的,單詞是由語言的基本符號依據詞法規則組成的。語言基本符號的集合,稱為字符集。

英文字母:a~z和A~Z數字字符:0~9特殊字符:!"#%&'()*+,-./:;<>=?[]\^_{}|~空白字符:空格、換行符、水平制表符(HT)、垂直制表符(VT)、換頁符(FF)C語言的字符集是7位ASCII碼的子集,組成如下:5

sum=x+ysum=x+ysum=x+ysum=x+y2.1.2

詞法元素

C語言中單詞,共分5類:標識符、關鍵字、常量、運算符和定界符(標點符號)。

例2.1sum=x+y

該表達式,共5個單詞sum、=、x、+和y。5556

例2.2inta,b=10;

該語句,共7個單詞int、a、,、b、=、10和;。

例2.3+++++y

該表達式,共4個單詞++、++、+和y。⑴按單詞種類和詞法規則區分單詞;⑵空格符起到單詞間隔和排版之作用;⑶回車符起到單詞間隔和換行之作用;6

{}----括起來的部分重復0次或多次。

[]----括起來的部分出現0次或1次。

()----表示結成一組。2.2語法規則2.2.1

BNF范式

2.2.2

EBNF范式

2.2.3

語法圖

<實數>::=<整數部分>.<小數部分>|.<小數部分>

<實數>::=[<整數部分>].<小數部分>標識符字母字母數字目錄72.3標識符、關鍵字及分隔符2.3.1

標識符

標識符是以字母或下劃線開頭的、由字母、數字和下劃線符號組成符號序列。標識符字母下劃線字母下劃線數字

標識符K_idx_coordtime1

非標識符20_sum(不能以數字開頭)

not#me(特殊符號#不是組成字符)

C語言中是區別大小寫字母的。Time和time以是不同的兩個標識符。標識符一般標識符關鍵字

程序員構造使用的標識符,其詞義由說明語句給出。

C語言保留使用的標識符,其詞義由C語言預先約定。目錄8auto_Bool*breakcasechar_Complex*constcontinuedefaultrestrict*dodoubleelseenumexternfloatforgotoif_Imaginary*inline*intlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatileWhile2.3.2

關鍵字

關鍵字也稱作保留字,是被系統賦予特定含義并有專門用途的標識符,程序員不能作為一般標識符使用。表2.2標準C的關鍵字2.3.3

分隔符

分隔符統稱為空白字符,包括空格符、制表符、換行符、換頁符及注釋符,它們在語法上僅起分隔單詞的作用。

當程序中兩個相鄰的單詞之間不用分隔符就不能將兩者區分開時則必須加分隔符(通常用空格符)。為了使程序更加清晰,便于閱讀,任何單詞之間都可以加適當空格符。例如,intx,y;不能寫成intx,y;92.4基本數據類型2.4.1

基本類型的分類表2.3C語言類型與類別C語言類型類型分類short,int,long,longlong

#

(signed和unsigned)Char(signed和unsigned)_Bool

#enum{…}整型基本類型float,double,longdouble_Complex

#,_Imaginary

#浮點型復數類型T*T[…]struct{…}union{…}指針類型數組類型結構類型聯合類型導出類型void空類型目錄10

數據類型是由編譯系統實現了的數據結構。它的基本目的和作用如下:⑴確定數據的邏輯分類;⑵確定數據的存儲結構。2.4.2

基本類型的名字《數據結構》自然數無理數實數復數整數有理數數學的數分類:0和負數分數、有限循環小數無限循環小數虛數機器的數分類:浮點數定點數非數值之數據數字化編碼技術存儲二進制位數

數據類型是恰當反映了數據的邏輯和物理兩個因素之結果!112.4.2

基本類型的名字charintfloatdoublelongdoublesignedcharunsignedcharsignedintunsignedintsignedlongintsignedshortintsignedintunsignedlongintunsignedshortintunsignedint字符類型整型類型浮點類型定點數浮點數122.4.3

字符類型0000000000000001000000100000001100000100111111110111111110000000…1000000110000010100000111000010011111110…01234255127128…129130131132254…01234-1127-128…-127-126-125-124-2…完整類型名簡寫類型名字節長度值域charsignedcharunsignedcharcharsignedcharunsignedchar111有符號:-128~127無符號:0~255-128~1270~255字符類型存儲長度統一為1個字節。signed和unsigned定義最高位是否為符號位。char是有符號還是無符號機器有關,通常char與signedchar是同一類型。132.4.4

整型類型完整類型名簡寫類型名長度值域signedintunsignedintsignedshortintsignedlongintunsignedshortintunsignedlongintintunsignedshortlongunsignedshortunsignedlong2或42或42424242字節:-32768~327674字節:-2147483648~21474836472字節:0~655354字節:0~4294967295-32768~32767-2147483648~21474836470~655350~4294967295

如果超出類型值域的數被存儲在同類型的存儲單元,或者運算的結果超出類型值域,會導致計算錯誤!這種情況,稱為溢出。0[]下溢出上溢出14目錄2.4.5

浮點類型(IEEE754標準)

一個二進制浮點數V可表示成帶符號的m乘以基b的指數x次冪,即:

V=(-1)s×M×2E其中:s表示符號位(0/1),1≤M<2,M稱為尾數,E為指數。1010.1(2)=1.0101×23IEEE754標準形式[-10.0(10)]

=[-1.01(2)×211(2)]

=

11000001

0010000000000000000000003130…23

22

1

0

指數+127尾數

指數采用移碼存儲尾數整數部分的1不保存23bit8bit152.4.5

浮點類型(IEEE754標準)特殊值:(1)如果指數是0并且尾數的小數部分是0,這個數±0(和符號位相關)(2)如果指數

=2e-1,

即指數部分所有位全部是1,并且尾數的小數部分是0,這個數是±∞(同樣和符號位相關,這里e是指數的位數,如上頁例中e等于8)(3)如果指數

=2e-1,

并且尾數的小數部分非0,這個數表示為不是一個數(NAN)。64位的浮點數,符號1位,指數11位,尾數52位,指數偏移量為1023。16完整類型名簡寫類型名長度值域floatdoublelongdoublefloatdoublelongdouble48≥8|1.175e-38|~|1.7e+38||2.2e-308|~|1.799e+308|由具體實現定義2.4.5

浮點類型

如果超出類型值域的數被存儲在同類型的存儲單元,或者運算的結果超出類型值域,會導致計算錯誤!這種情況,稱為溢出。

類型值域的數是離散值,即理論上在類型值域的數,實際上可能是其近似值。0[][]溢出區域172.5常量與變量2.5.1

文字常量C有4種類型的常量:整型、浮點型、字符型和字符串型。常量的數值和類型從其文字書寫格式即可判別。下面介紹基本類型常量的書寫格式.1.整型常量十進制無八進制0十六進制0x或0X前綴unsignedu

或Ulongl

或Lunsignedlongul

或ULlonglong(C99)

ll

或LLunsignedlonglong(C99)ull或ULLint無后綴0XFUL(=1510,數據類型是unsignedlong,4byte)

0314(=20410)√314√0678×目錄182.浮點常量通常帶小數點的十進制數形式

指數形式,即科學計數法:R

e±n

=R×10±nfloatf

或Fdouble無

longdoublel

或L后綴

合法非法1.f4byteE+108byte1.2e-123L≥8byte10e1.58byte10E10L≥8byte1.2eF4byte314314.0

int

double193.字符常量

字符常量寫成用一對單引號括住單個字符的形式:‘圖形字符‘或‘轉義字‘

這里,一對單引號是字符常量的標志,稱為定界符。字符常量是一個整數,其值為該字符在ASCII中的字符碼。表2.5轉義序列轉義序列ASCII碼字符轉義序列ASCII碼字符\0\a\b\t\n\v\f0789101112空字符響鈴符退格符水平制表符換行符垂直制表符換頁符\r\"\'\?\\\ooo\xh2550~255回車符雙引號單引號問號反斜線八進制數十六進制數

(1)單引號(')和反斜線(\)雖然是圖形符號,但作為字符常量時必須用轉義序列。如'\'和'\\'是合法的,而'''和'\'是非法的。

(2)雙引號(")作為字符常量時既可用圖形符號也可用轉義序列表示。如'"'和'\"'均合法。204.字符串常量字符串常量寫成用一對雙引號括住0至多個字符的形式:"字符序列"這對雙引號是字符串的定界符,不是字符串的組成部分。字符串的組成字符可以是圖形符號也可以是轉義序列。

"Iamastring\n“"""3'40\"""c:\tc""c:\\tc"C的語法規定,在程序中書寫字符串時不能直接中途換行。

行連接的方法是:在前一行的末尾輸入反斜線(\)再換行,這里反斜線是續行符,可以將多行合并成一行。

"Hello,howareyou""Hello,\howareyou"×√

符號串的存儲長度是符號串所含符號的個數加1個字節。"world"

world\0存儲結構212.5.2

符號常量

表示一個常量的標識符,就是符號常量。C語言中有三種定義符號常量的方法:(1)用#define指令定義一個符號常量(2)用const聲明語句定義一個符號常量(3)用枚舉類型定義一組符號常量(在2.10節介紹)#defineLOWER0/*表的下限*/#defineUPPER300/*表的上限*/#defineSTEP20/*步長*/1.#define定義常量

語法:#define標識符常量

語義:標識符是常量的名稱,程序中使用標識符和常量是一樣的含義。222.const定義常量constdoublePI=3.14159;/*PI定義為double類型的浮點數3.14159*/constintDOWN=0x5000;/*DOWN定義為int類型的整數0x5000(下光標鍵的掃描碼)*/constintYES=1,NO=0;/*YES和NO分別定義為int類型的整數1和0*/

const和#define

定義的符號常量在實現上有本質的不同,后者定義的標識符沒有對應的存儲單元,只是在編譯之前由預處理程序進行簡單的文本替換。

語法:const類型名標識符=常量;

語義:標識符是常量的名稱,程序中使用標識符和常量是一樣的含義。232.5.3

變量定義基本存儲單元地址基本存儲單元(不妨假設大小為1byte)102410251026204820492050intx;

int表明表明變量占用2byte,定點格式,最高位是符號位。存儲單元(占用2個基本存儲單元)&x=存儲單元首地址…………計算機內存示意圖

語法:類型名變量表;

語義:標識符是變量的名稱,表示是可以存儲類型名對應數據值域的一個數據之內存存儲單元。標識符,標識符,…,標識符存儲單元名稱x20482049242.5.3

變量定義

語法:類型名變量表;

語義:標識符是變量的名稱,表示是可以存儲類型名對應數據值域的一個數據之內存存儲單元。標識符,標識符,…,標識符inttotal;intaverage;/*總和*//*平均值*/—total—averagefloateps=1.0e-5;intcount=0,sum=0;charalert='\a',c;1.0e-5eps0count0sum'\a'alert—cintcount=sum=0;×25

表達式的值是指表達式計算的結果。

表達式的(數據)類型是指表達式值的(數據)類型。它是由運算符或運算對象確定的!運算符的優先級和結合性。(見2.6.2節)

2.6運算符和表達式

運算符是表示計算的符號。運算對象(或操作數)是參加運算的數據。操作數包括常量、變量和函數等。

目是指運算要求的運算對象之個數(數目)。

表達式是遵循計算機語言語法和語義規定書寫的計算式。它是高級語言描述計算步驟的核心語言成分之一。2.6.1

C運算符簡介

常量、變量和函數均約定稱為表達式。這樣,操作數可以統一稱為表達式。目錄262.6.2

運算符的優先級和結合性表2.6運算符的優先級和結合性運算符結合性(

)

[

]

->.

!~++--+-*&(類型)sizeof*/%+-<<>><<=>>===!=&^|&&||?:=+=-=*=/=%=&=^=|=<<=>>=,左右左左左左左左左左左左右右左優先級123456789101112131415272.6.3

算術運算

+

(單目正號運算符,或加法運算符,如+6、8+3)

(單目負號運算符,或減法運算符,如-6、8-3)

*

(乘法運算符,如8*3)

/

(除法運算符,如8/3)

%(取模運算符,或求余運算符,如8%3)

運算符%的操作數必須是整數類型,其它運算符的操作數可以是任意基本類型。

8+3表達式值:11,表達式類型:int8u+3u表達式值:11,表達式類型:unsignedint1/2表達式類型:int表達式值:0,

假設int

x,y;則x/y+1,表達式類型:int20-10-3表達式類型:int表達式值:7,8.0+3.0表達式類型:double表達式值11.0,11+11+1+y1

試給出下列代數式對應的表達式(其中假設floaty;)1/(1+1/(1+1/(1+y)))

試指出代數式的不正確C語言表達式是______。A.(a+b)/(c+d)/y*xB.(a+b)*x/(c+d)/yC.a*b*x/(c+d)*yD.x/(c+d)*(a+b)/yC運算符表282.6.4

關系運算運算符:<<=>>===!=數學符:<≤>≥=≠

運算符的操作數可以是任意基本類型。

關系表達式的計算結果總是int類型,取值為0或1。如果比較的關系成立,值為1(代表“邏輯真”),否則為0(代表“邏輯假”)。

例2.6根據變量說明,給出表達式的值。

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(表達式值:0)(5)x>y>z(表達式值:0)4x3y2z‘a‘c運算符表29

表達式a%2的功能是測試a的值是否是偶數。表達式!(a%2)

和表達式a%2==0是等價的。提示:!(a%2)的括號不能缺省。

操作數是任意基本類型,運算結果是int型。非0表示邏輯真True,0表示邏輯假False。2.6.5

邏輯運算運算符:&&||!數學符:∧∨?aba&&ba||b!a00非0非00非00非0000101111100表2.7邏輯運算的真值表運算符表a!(a%2)的值=1(a為偶數)0(a為奇數)

例2.7假設inta;說明語句,討論下列表達式。!(a%2)30

例2.8字符c的值是英文字母。

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

操作數是任意基本類型,運算結果是int型。非0表示邏輯真True,0表示邏輯假False。2.6.5

邏輯運算運算符:&&||!數學符:∧∨?運算符表

上式等價于(c>=‘a‘&&c<=‘z‘)||(c>=‘A‘&&c<=‘Z‘),即該表示式可以缺省()。

上式等價于c>=97&&c<=122||c>=65&&c<=90

。

上式等價于數學式(‘a‘≤c≤

‘z‘)∧(‘A‘≤c≤

‘Z‘)。0/11×31

操作數是任意基本類型,運算結果是int型。非0表示邏輯真True,0表示邏輯假False。2.6.5

邏輯運算運算符:&&||!數學符:∧∨?運算符表

例2.9某一年year是閏年。

閏年是指能被4整除但不能被100整除、或者能被400整除的年份。

!(year%4)&&year%100||!(year%400)

②①④③⑦⑥⑤↓↓↓↓↓↓↓?計算順序?④①⑥⑤⑦③②↓↓↓↓↓↓↓×√ynnyyy|n322.6.6

自增自減運算運算符表運算符:++--

操作數是任意基本類型之變量(或左值表達式),運算結果是:⑴變量的值加1或減1,其類型與變量類型一致;⑵表達式的值是變量自增自減之前或之后的值,其類型與變量類型一致。表達式基本形式前綴式后綴式++x--xx++x--先加減后取值后加減先取值x=x+1x=x+1x=x-1x=x-1

假設intx=0;,則

++x表達式的值:1

變量x的值:1

x++表達式的值:0

變量x的值:1--x表達式的值:-1

變量x的值:-1X--

表達式的值:0

變量x的值:-1332.6.6

自增自減運算運算符表運算符:++--

操作數是任意基本類型之變量(或左值表達式),運算結果是:⑴變量的值加1或減1,其類型與變量類型一致;⑵表達式的值是變量自增自減之前或之后的值,其類型與變量類型一致。

特別地,后綴式計算延遲至下列條件出現序列點(計算延遲的終止點稱為序列點):

&&或||或?:或,

完整表達式b+++b++表達式的值:0變量b的值:2

例2.11設變量說明為inta=1,b=0;計算下列表達式的值。000a--&&a表達式的值:0變量a的值:0100342.6.7

賦值運算運算符表

賦值運算是將運算器的數據存儲到內存單元--變量之中。除了=運算之外,其它均為復合賦值運算。運算符:=+=-=*=/=%=<<=>>=&=^=|=1.簡單賦值運算

語法:左值表達式=表達式

語義:將表達式的值,存儲到左值表達式所指定的內存單元之中,賦值表達式的值取左值表達式的值。

假設intx,y;,給出下列表達式的值。

x=y=314-x-y3143143143142.復合賦值運算

語法:左值表達式op=表達式

語義:相當于左值表達式=左值表達式op表達式。352.6.8

條件運算運算符表

語法:表達式1?表達式2:表達式3

語義:條件運算符(?:)是一個三目運算符

,根據表達式1的真假值,條件表達式的值為表達式2的值或表達式3的值。

假設inta,b;,指出下列表達式的功能。

a>b?a:ba>babTF

表達式a>b?a:b的功能是計算a和b的最大值,即max{a,b}。36

由于逗號運算的左結合性,逗號表達式的一般形式如下:

((…(表達式1,表達式2),…),表達式n)2.6.9

逗號運算運算符表

語法:表達式1,表達式2

語義:順序計算表達式1和表達式2,逗號表達式的值為表達式2的。

((…(表達式1,表達式2),…),表達式n)

假設inti;floatx;,給出下列表達式的結果。

i=2,i%3,x=3.14-i-x2203.143.143.14372.6.10

sizeof運算運算符表

語法:

sizeof(類型名)

sizeof

表達式

語義:sizeof單目運算。前者計算給定的類型名對應存儲單元之字節數;后者計算給定的表達式結果之數據類型對應存儲單元之字節數。

假設16位版本的C語言,即int類型占用2字節,則

sizeof(long)/*值為4*/doublex;sizeofx/*值為8*/inta=1,b=1;sizeof(a+b)/*值為2*/

特別提示:對于含有比sizeof運算級別低的運算符之運算對象表達式,最外層是否使用無括號,其計算意義存在差異。inta=1,b=1;sizeofa+b/*值為3*/2382.7位運算與位表達式運算符表運算符:~&|^<<>>名稱:按位求反位與位或異或左移右移2.7.1

按位求反運算

求反運算符(~)是單目運算,對操作數的每個二進制位取相反值,即0變1,1變0。

假設shorta=5;unsignedshortb=5;,則a0000000000000101~a1111111111111010真值:-6b0000000000000101~b1111111111111010真值:65530目錄392.7.2

按位與、或、加運算

位與(&)和位或(|),是按與邏輯與(&&)和邏輯或(||)的真值表,逐位獨立運算。x0110100011010001mark1111111100000000X

&

mark01101000000000001111111111010001X

|

mark011010001101000101101000000000001111111111010001

MAKR值稱為邏輯尺(或屏蔽碼),其應用十分廣泛。如果網絡IP地址設置和自動控制系統等。運算符表40x^y2.7.2

按位與、或、加運算

位與(&)和位或(|),是按與邏輯與(&&)和邏輯或(||)的真值表,逐位獨立運算。

位異或(^),是按如下真值表,逐位獨立運算。pqp^q000011101110x01101000110100011111111100000000y1001011111010001運算符表412.7.3

左移和右移運算

語法:表達式1<<表達式2

表達式1>>表達式2

語義:將表達式1的值左移(<<)或右移(>>)表達式2之位數,其中,表達式2為大于0的整型表達式。運算符表左移:高位丟棄,低位補0右移:低位丟棄,高位無符號類型--補0

有符號類型--補符號位

有些機器是補0提示:左移1位相當于表達式1乘以2;右移1位相當于表達式1除以2。42

假設inta=11;unsignedb=15;,移位運算例子如下

。表達式二進制表示值行為ab-aa<<2b>>3-a>>20000000000001011000000000000111111111111111101010000000000101100000000000000000111111111111111011115-11441-3對a進行負號運算a左移2位b右移3位-a右移2位(補符號位其他機器可能補0)43

例2.16

寫一個表達式,取一個整數x,從第m位開始向右的n位,并使其向右端靠齊。?…

?b16

bm+1

bm

bm-1

bm-n+1m-n+1nx>>m-n+10…00

0

bm

bm-1

bm-n+116-nn0…0

0

0

1

1…116-nnb15

bm+1

bm

bm-1

bm-n+1bm-n

…b0nm-n+1x~(0xffff<<n)x>>m-n+1&~(0xffff<<n)44

例2.17

壓縮和解壓:21世紀日期的日、月和年3個整數壓縮成1個16位的整數

。日月年151110870547yearmonthdaydatedate=month<<=7|day<<=11|year

452.8類型轉換2.8.1

整數提升

任何表達式中的char、signedchar、unsignedchar、short和unsignedshort都要先轉換成int或unsigned之后,才參與各種運算。這種轉換,稱為“整數提升”。

如果原類型的所有值可以用int表示,則轉換成int,否則轉換成unsigned。整數提升

提升方法:無符號整數提升,擴展位填充0;有符號整數提升,擴展位填充符號位。假設16位版,signedcharx=-3;,則111111011111111111111101目錄462.8.2

一般算術轉換

除賦值運算之外引起的類型轉換,稱為算術轉換。整數提升之后,如果表達式的兩個操作數類型不相同,就會發生算術轉換。char/shortintunsignedlongunsignedlongfloatdoublelongdouble

例2.12設c、l和d分別為char、long和double型變量,則表達式:c*l+dintlonglongdoubledouble

例2.13計算表達式-1<1U

的值。[-1]補=1111111111111111[1

]補=0000000000000001表達式-1<1U

的值為0,即邏輯假值false。轉換方法:等長整數轉換保持位串不變,取消符號。算術運算、關系運算和條件運算47課堂練習指出下列表達式的類型。(假設16位版)

1.

12,3.14

double

2.

12,3.14,’a’

int

3.

1>2?314u:’a’

unsignedint

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論