第2章数据类型、运算符与表达式(7学时).ppt
大连工业大学 赵秀岩制作,第二章C语言的基本数据类型与表达式,问题一:C的数据类型,不同存储类型所占的字节数与编译环境有关?,问题二:常量与变量,一、常量:其值不发生改变的量称为常量整型常量、浮点常量、字符常量、枚举常量、二、变量:其值可变的量称为变量。整型变量、浮点变量、字符变量、枚举变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用。,一、常量与符号常量,标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。数字、字母、下划线数字不能开头系统保留的关键字不能用作标识符直接常量(字面常量):整型常量:12、0、-3;实型常量:4.6、-1.23;字符常量:a、b。符号常量:用标识符代表一个常量。在语言中,可以用一个标识符来表示一个常量,称之为符号常量。,符号常量-“宏”,例题3.1#define CHANG 10/*注意中间没有等号,结束没有分号*/#define KUAN 20main()int s;sCHANG*KUAN;printf(“s=%d”,s);程序运行结果:?使用符号常量的好处是:含义清楚;能做到“一改全改”。,问题三:整型数据,1.整型常量的表示方法 十进制整型常量:如:10、-2、0等。八进制整型常量:以数字0开头,如023,0345。十六进制整型常量:以0 x开头,如0 x123,0 x3d2。,注意:长整型常量数必须在其后用标识符“L”说明,如:23L、-6L等。,整型常量合法性比较,合法的十进制整常数?237、-568、65535、1627、023、23D 合法的八进制数?015、0101、0177777、256、03A2、-0127合法的十六进制整常数?0X2A、0XA0、0XFFFF、5A、0X3H,2.整型变量,整型变量的分类:int、unsigned intshort int、unsigned short intlong int、unsigned long int整型变量的存储:“补码”正数的补码:与原码相同负数的补码:将该数的绝对值的二进制形式按位取反再加1。,“10”的补码,整型变量的定义,变量定义的一般形式为:类型说明符 变量名标识符,变量名标识符,.;例如:int a,b,c;/*(a,b,c为整型变量)*/long x,y;/*(x,y为长整型变量)*/unsigned p,q;/*(p,q为无符号整型变量)*/,在书写变量定义时,应注意以下几点:允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。最后一个变量名之后必须以“;”号结尾。变量定义必须放在变量使用之前。一般放在函数体的开头部分。,插曲:printf函数的使用,Printf函数有两种使用格式:printf(*);直接输出双引号中的字符串printf(*,*);以某种格式输出变量的值,整型变量定义举例,【例3.2】整型变量的定义与使用。main()int a,b,c;a=12;b=4;c=a+b;printf(“c=%dn”,c);,若将第二行与第三行互换?若将第一行与第二行互换那?,问题四:实型数据,1.实型常量的表示方法 在语言中,实数只采用十进制。它有二种形式:十进制小数形式、指数形式。十进制小数形式:如:3.1415、2.6、168、.5、0.0等。注意不能省掉小数点。指数形式:mE+n 或mE-n,E前必须有数字;E后必须为整数;,2.实型变量,单精度(float型)双精度(double型)长双精度(long double型),2.2 实型变量的分类,2.实型变量,2.3 实型变量的定义实型变量定义的格式和书写规则与整型相同。【例3.7】有效数字与舍入误差。main()float a;double b;a=33333.33333;b=1245678933333.33333333333333;printf(%fn%fn,a,b);,问题五:字符型数据,5.1字符型常量字符常量是用单引号括起来的一个字符。例如:a、b、=、+、?不合法的字符常量:ab,xy 在语言中,字符常量有以下特点:字符常量只能用单引号括起来,不能用双引号或其它括号。字符常量只能是单个字符,不能是字符串。字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如5和5 是不同的。5是字符常量,不能参与运算。字符常量在计算机中存储的是ASCII码值。是一个整数。,5.2 转义字符,转义字符是一种特殊的字符常量。转义字符以反斜线“”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。printf中的“n”:“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。,常用的转义字符及其含义,转义字符的使用,【例题3.9】main()int a,b,c;a=5;b=6;c=7;printf(“ab ctderfn”);printf(“hijktLbMn”);,5.3 字符变量,字符变量用来存储字符常量,即单个字符。字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。例如:char a,b;,5.4 字符数据在内存中的存储形式及使用方法,每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。如x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a,b赋予x和y值:a=x;b=y;实际上是在a,b两个单元内存放120和121的二进制代码:,字符变量举例,【例3.9】向字符变量赋以整数。main()char a,b;a=120;b=121;printf(%c,%cn,a,b);printf(%d,%dn,a,b);,字符变量应用举例,【例3.10】main()char a,b;a=a;b=b;a=a-32;b=b-32;printf(%c,%cn%d,%dn,a,b,a,b);,5.5字符串常量,字符串常量是由一对双引号括起的字符序列。例如:“CHINA”,“C program”,“$12.5”字符串常量和字符常量主要有以下区别:1)字符常量由单引号括起来,字符串常量由双引号括起来。2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。4)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中存放字符0(ASCII码为0)。这是字符串结束的标志。,定义后的变量:,变量名和变量的类型 int a;变量一经定义会得到属于自己的存储空间:地址,&a变量的值(变量所在地址中存储的数据)a=16;,问题六:变量的值,在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法为变量提供初值。定义变量的同时赋值int a=3;float b3.14;char cs;被定义的变量部分赋值int a,b,c7;先定义再赋值int a,b;a2;b9;应注意,在定义中不允许连续赋值,如a=b=c=5是不合法的。,问题七:各类数值型数据间的混合运算,一种是自动转换自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。3)所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。4)char型和short型参与运算时,必须先转换成int型。5)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。一种是强制转换,自动类型转换规则,自动类型转换举例,char ch;int i;float f;double d;result=ch/i+f*df+d;运算次序为:(1)ch被转换整型,float型的f被转换为double型。(2)ch/I的结果被转换为double型,因为f*d是double型。(3)最后的结果是double型,因为在运算之前两个操作数均为double型,强制类型转换,强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(float)a 把a转换为实型(int)(x+y)把x+y的结果转换为整型在使用强制转换时应注意以下问题:类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。,强制类型转换举例,【例3.13】main()float f=5.75;printf(int)f=%d,f=%fn,(int)f,f);,强制类型转换举例,main()float a;int c,b;a=2.5,b=5;c=(int)a+b;printf(%d,%d,a,c);,问题八:运算符与表达式,语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使语言功能十分完善。这也是语言的主要特点之一。语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。,8.1 运算符简介,运算符的几个属性:操作数:参加操作的对象“目”:操作数的个数单目、双目、三目结合性:从左向右:先左后右从右向左:先右后左优先级:,C语言运算符分类,8.2 算术运算符和算术表达式,基本的算术运算符(、*、/、)*、/、:第三优先级、:第四优先级注意:两个整数作除法,结果“向零取整”:5/31,56/105,78/107;参加除求余以外的算术运算的操作数有一个是实数,则结果为“double”型的。参加“求余”运算的运算对象必须为“整数”:5%32,1530,7%97;,算术表达式和运算符的优先级与结合性,算术表达式:算术运算符操作数优先级:a-b*c 等价于 a-(b*c)a-b+c 等价于(a-b)+c结合性x-y+z 等价(x-y)+z 左结合xyz 等价 x(yz)右结合如果一个算术运算符的两侧的数据类型不相同,自动进行类型转换。,4.自增、自减运算符(+、-),自增,自减运算符:自增1运算符记为“+”,其功能是使变量值自增1。自减1运算符记为“-”,其功能是使变量值自减1。自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:+i:i自增1后再参与其它运算。-i:i自减1后再参与其它运算。i+:i参与运算后,i的值再自增1。i-:i参与运算后,i的值再自减1。,自加、自减运算符应用举例,main()int i=8;printf(“%dn,+i);printf(%dn,-i);printf(%dn,i+);printf(%dn,i-);,自加、自减运算符应用举例,main()char a=a,b;print(%c,+a);printf(%cn,b=a+);程序运行后的输出结果是 A)b,b B)b,c C)a,b D)a,c,自加、自减运算符应用举例,设有以下定义int a=0;double b=1.25;char c=A;#define d 2则下面语句中错误的是A)a+;B)b+C)c+;D)d+;,自加、自减运算符应用举例,设正x、y均为整型变量,且x=10,y=3,则以下语句的输出结果是 printf(”%d,%dn”,x-,-y);A)10,3 B)9,3 C)9,2 D)10,2,自加、自减运算符应用举例,以下选项中,与k=n+完全等价的表达式是 A)k=n,n=n+1 B)n=n+1,k=n C)k=+n D)k+=n+1,3.9赋值运算和赋值表达式,1.赋值运算符 简单赋值运算符:“=”赋值表达式:由“=”连接的式子 其一般形式为:变量=表达式例如:x=a+b w=sin(a)+sin(b)赋值表达式的功能:计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。,2.类型转换,如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。,赋值运算举例,【例3.18】main()int a,b=322;float x,y=8.88;char c1=k,c2;a=y;x=b;a=c1;c2=b;printf(%d,%f,%d,%c,a,x,a,c2);,3.复合的赋值运算符,在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如:+=,-=,*=,=,%=,=,&=,=,|=构成复合赋值表达式的一般形式为:变量 双目运算符=表达式,a+=3它等效于变量=变量 运算符 表达式,a=a+3举例 a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7)r%=p 等价于r=r%p,3.10逗号运算符和逗号表达式,在语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。其一般形式为:表达式1,表达式2 其求值过程:分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。,逗号运算符举例,【例3.19】main()int a=2,b=4,c=6,x,y;y=(x=a+b),(b+c);/*y=(x=a+b),(b+c);*/printf(y=%d,x=%d,y,x);,逗号表达式两点说明:,逗号表达式一般形式中的表达式1和表达式2 也可以又是逗号表达式。例如:表达式1,(表达式2,表达式3)可以把逗号表达式扩展为以下形式:表达式1,表达式2,表达式n 整个逗号表达式的值等于表达式n的值。程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。,