第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

提交评论