《基本数据类型与表达式和运算符.ppt》由会员分享,可在线阅读,更多相关《基本数据类型与表达式和运算符.ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、基本数据类型运算符与表达式C语言的数据类型C+中还引入了一个新的数据类型:布尔型bool常用数据类型的取值范围类型标识符类型说明长度(字节)范围备注char字符型1-128127unsigned char无符号字符型10255short int短整型2-3276832767unsigned short int无符号短整型2065535int整型4-21474836482147483647unsigned int无符号整型404294967295long长整型unsigned long无符号长整型long long64位长整型8-922337203685477580892233720368547
2、75807unsigned long long无符号64位长整型8018446744073709551615float实型(单精度)4-3.4028210-383.4028210387位有效位double实型(双精度)8-1.7976910-3081.797691030816位有效位long double实型(长双精度)12-1.7976910-3081.797691030819位有效位bool布尔型1true:真值/false:假值如何使用sizeofprintf(sizeof(float)=%un,sizeof(float);printf(sizeof(double)=%un,sizeof
3、(double);printf(sizeof(longdouble)=%un,sizeof(longdouble);常量与变量常量与变量2.2.1常量和符号常量常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量其值不能被改变的量称为常量。常量区分为不同的类型,如、等为整型常量整型常量,4.6,-1.23等为实型常实型常量量,a,d为字符常量字符常量,一般从其字面形式即可判别,也可以用一个标识符标识符代表一个常量。例#define PI 3.1415926main()float s,r,l;r=10.;l=2.*PI*r;s=PI*r*r;printf(l=%f s=%fn,l,s);
4、printf(PI=%fn,PI);程序中用#define#define命令行定义PIPI代表常量3.1415926,此后凡在此文件中出现的PI都代表3.1415926,可以和常量一样进行运算 这种用一个标标识识符符代代表表一一个个常常量量的的,称称为为符符号号常常量量,即标标识识符符形形式式的的常常量量,注意符号常量不同于变量,它的值在其作用域(在本例中为主函数)内不能改变,也不能再被赋值。如再用以下赋值语句给PI赋值:PI=3.1416是错误的。习惯上,符号常量名用大写,变量用小写,以示区别变量n其值可以改变的量称为变量其值可以改变的量称为变量。一个变量应该有一个名字名字,在内存中占据一定
5、的存储单元存储单元。在该存储单元中存放变量的值。请注意区分变量名和变量值变量名和变量值这两个不同的概念。n和其它高级语言一样,用来标识变量名、符号常量名、函数名、用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称标识符数组名、类型名、文件名的有效字符序列称标识符,简单的说,标简单的说,标识符就是一个名字识符就是一个名字。nC语言规定标识符只能由字母、数字和下划线三种字符组成语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。如nsum,average,class,day,month,student_name,n下面是不合法的标识符和变量名
6、:nM.D,John,$123.#33,3D64,abn注意,大写字母和小写字母被认为是两个不同的字符大写字母和小写字母被认为是两个不同的字符。因此,和是两个不同的变量名。习惯上,变量名用小写字母表示,以增加可读性。整型数据n整型常数的表示方法1.十进制。例如123,-456,0。2.八进制。以0开头,后面跟几位的数字(0-7)。例如:0123=(123)8=(83)10;-011=(-11)8=(-9)103.十六进制。以0 x开头,后面跟几位的数字(0-9,A-F)。例如:0 x123=291,-0 x12=-18。阅读程序写结果main()int a=0123;b=0 x123;prin
7、tf(“a=%d,b=%d”,a,b);a=83,b=291实型数据n实型常量的表示方法1.十进制小数形式。由数字,小数点组成(必须有小数点)。例如:.123、123.、123.0、0.02.指数形式。格式:aEn或者aen。例如:123e3、123E3都是实数的合法表示。注意:n字母e或E之前必须有数字,e后面的指数必须为整数。例如:e3、2.1e3.5、.e3、e都不是合法的指数形式。n规范化的指数形式。在字母e或E之前的小数部分,小数点左边应当有且只能有一位非0数字。用指数形式输出时,是按规范化的指数形式输出的。例如:2.3478e2、3.0999E5、6.46832e12都属于规范化的
8、指数形式。n实型常量都是双精度,如果要指定它为单精度,可以加后缀f。实型变量1.实型数据在内存中的存放形式一个实型数据一般在内存中占4个字节(32位)。与整数存储方式不同,实型数据是按照指数形式存储的。系统将实型数据分为小数部分和指数部分,分别存放。实型数据存放的示意图。ANSIC没有规定用多少位表示小数,多少位表示指数部分,由C编译系统自定。例如,很多编译系统以24位表示小数部分,8位表示指数部分。小数部分占的位数多,实型数据的有效数字多,精度高;指数部分占的位数多,则表示的数值范围大。实型数据的舍入误差n实型变量是用有限的存储单元存储的,因此提供的有效数字是有限的,在有效位以外的数字将被舍
9、去,由此可能会产生一些误差。floata,b;a=123456.789e5;b=a+20;printf(a=%f,b=%fn,a,b);printf(a=%e,b=%en,a,b);结论:n由于实数存在舍入误差,使用时要注意:1.不要试图用一个实数精确表示一个大整数,记住:浮点数是不精确的。2.避免直接将一个很大的实数与一个很小的实数相加、相减,否则会“丢失”小的数。3.许多C编译系统将实型常量作为双精度实数来处理,这样可以保证较高的精度,缺点是运算速度降低。在实数的后面加字符f或F,如1.65f、654.87F,使编译系统按单精度处理实数。4.实型常量可以赋值给一个float、double、
10、longdouble型变量。根据变量的类型截取实型常量中相应的有效数字。字符型数据n字符常量1.可显示的字符常量直接用单引号括起来,如,a、x、D、?、$等都是字符常量。2.所有字符常量(包括可以显示的、不可显示的)均可以使用字符的转义表示法表示(ASCII码表示)。3.转义表示格式:ddd或xhh(其中ddd,hh是字符的ASCII码,ddd八进制、hh十六进制)。注意:不可写成0 xhh或0ddd(整数)。4.预先定义的一部分常用的转义字符。预先定义的一部分常用的转义字符字符变量n字符型变量是用来存放字符数据,同时只能存放一个字符。所有编译系统都规定以一个字节来存放一个字符,或者说,一个字
11、符变量在内存中占一个字节。字符变量n字符数据在内存中的存储形式及其使用思考:数字5和字符5一样吗?字符数据在内存中的存储形式:以字符的ASCII码,以二进制形式存放,占用1个字节。n可以看出字符数据以ASCII码存储的形式与整数的存储形式类似,这使得字符型数据和整型数据之间可以通用(当作整型量)。具体表现为:n可以将整型量赋值给字符变量,也可以将字符量赋值给整型变量。n可以对字符数据进行算术运算,相当于对它们的ASCII码进行算术运算。n一个字符数据既可以以字符形式输出(ASCII码对应的字符),也可以以整数形式输出(直接输出ASCII码)。n注意:尽管字符型数据和整型数据之间可以通用,但是字
12、符型只占1个字节,即如果作为整数使用范围0-255(无符号)-128-127(有符号)。charc1=a;charc2=x61charc3=141;charc4=97;charc5=0 x61;charc6=0141;printf(nc1=%c,c2=%c,c3=%c,c4=%c,c5=%c,c6=%cn,c1,c2,c3,c4,c5,c6);printf(c1=%d,c2=%d,c3=%d,c4=%d,c5=%d,c6=%dn,c1,c2,c3,c4,c5,c6);大小写字母的转换n输入一个英文字符,如果是小写字符请转换成大写字符;如果是大写字符请转换成小写字符。最后输出转换的结果。字符常量
13、与字符串常量1.区分字符常量与字符串常量。如“a”和a。2.C语言规定:在每个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。C规定以0(ASCII码为0的字符)作为字符串结束标志。3.如:“CHINA”在内存中的存储应当是:(长度=6)CHINA04.不能将字符串赋给字符变量。5.C语言没有专门的字符串变量,如果想将一个字符串存放在变量中,可以使用字符数组。即用一个字符数组来存放一个字符串,数组中每一个元素存放一个字符。各类数值型数据(整型、实型、字符型)的混合运算n整型(包括int,short,long)和实型(包括float,double)数据可以混合运算,另外字符
14、型数据和整型数据可以通用,因此,整型、实型、字符型数据之间可以混合运算。在进行运算时,不同类型的数据先转换成同一类型,然后进行计算,转换的方法有两种:n自动转换(隐式转换)n强制转换自动转换发生在不同类型数据进行混合运算时,由编译系统自动完成。转换规则:n类型不同,先转换为同一类型,然后进行运算。n图中纵向的箭头表示当运算对象为不同类型时转换的方向。可以看到箭头由低级别数据类型指向高级别数据类型,即数据总是由低级别向高级别转换。即按数据长度增加的方向进行,保证精度不降低。n图中横向向左的箭头表示必定的转换(不必考虑其它运算对象)。如字符数据参与运算必定转化为整数,float型数据在运算时一律先
15、转换为双精度型,以提高运算精度(即使是两个float型数据相加,也先都转换为double型,然后再相加)。赋值运算,如果赋值号“=”两边的数据类型不同,赋值号右边的类型转换为左边的类型。这种转换是截断型的转换,不会四舍五入。强制转换n强制转换是通过类型转换运算来实现。一般形式:(类型说明符)表达式功能:把表达式的结果强制转换为类型说明符所表示的类型。例如:n(int)a将a的结果强制转换为整型量。n(int)(x+y)将x+y的结果强制转换为整型量。n(float)a+b将a的内容强制转换为浮点数,再与b相加。写出运行结果main()floatf=5.75;printf(int)f=%dn,(
16、int)f);printf(f=%fn,f);/*输出f的值*/求下列算术表达式的值1.x+a%3*(int)(x+y)%2/4x=2.5,a=7,y=4.72.(float)(a+b)/2+(int)x%(int)ya=2,b=3,x=3.5,y=2.52.53.5运算符运算符 l狭义的运算符是表示各种运算的符号。C语言运算符丰富,范围很宽,把除了控制语句和输入/输出以外的几乎所有的基本操作都作为运算符处理,所以C语言运算符可以看作是操作符。C的运算符有以下几类:的运算符有以下几类:/(除法运算符(除法运算符)l两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。但是如果除数或被除数
17、中有一个为负值,则舍入的方向是不固定的,多数机器采用“向0取整”的方法(实际上就是舍去小数部分,注意:不是四舍五入)。特别说明特别说明l如果参加+,-,*,/运算的两个数有一个为实数,则结果为double型,因为所有实数都按double型进行计算。l求余运算符%,要求两个操作数均为整型,结果为两数相除所得的余数。求余也称为求模。一般情况,余数的符号与被除数符号相同。思考:-8%5;8%-5=赋值运算符赋值运算符 l赋值运算符左边必须是变量,右边可以是常量、变量、函数调用或常量、变量、函数调用组成的表达式。l赋值符号“=”不同于数学的等号,它没有相等的含义。l赋值运算时,当赋值运算符两边数据类型
18、不同时,将由系统自动进行类型转换。转换原则是:先将赋值号右边表达式类型转换为左边变量的类型,然后赋值。转换规则转换规则l将实型数据(单、双精度)赋给整型变量,舍弃实数的小数部分。l将整型数据赋给单、双精度实型变量,数值不变,但以浮点数形式存储到变量中。l将double型数据赋给float型变量时,截取其前面7位有效数字,存放到float变量的存储单元中(32bits)。但应注意数值范围不能溢出。将float型数据赋给double型变量时,数值不变,有效位数扩展到16位(64bits)。转换规则转换规则l字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量为2个字节,因此将字符数据(8bi
19、ts)放到整型变量低8位中。有两种情况:1.如果所使用的系统将字符处理为无符号的量或对unsignedchar型变量赋值,则将字符的8位放到整型变量的低8位,高8位补0。2.如果所使用的系统将字符处理为带符号的量(如TurboC),若字符最高位为0,则整型变量高8位补0;若字符最高位为1,则整型变量高8位全补1。这称为符号扩展,这样做的目的是使数值保持不变。总之:总之:不同类型的整型数据间的赋值归根到底就是:按照存储单元的存储形式直接传送。(由长型整数赋值给短型整数,截断直接传送;由短型整数赋值给长型整数,低位直接传送,高位根据低位整数的符号进行符号扩展)。复合赋值运算符复合赋值运算符l在赋值
20、符“=”之前加上某些运算符,可以构成复合赋值运算符,复合赋值运算符可以构成赋值表达式。C语言中许多双目运算符可以与赋值运算符一起构成复合运算符,即:+=,-=,*=,/=,%=,=,&=,|=,=注意:赋值运算符、复合赋值运算符的优先级比算术运算符低。a=12la+=a-=a*ala+=a-=(a*a)la+=(a-=(a*a)la+=(a=a-(a*a)la+=(a=a-a*a)la=a+(a=a-a*a)a=-264自增自增+、自减、自减-运算符运算符 l单目运算符,使变量的值增1或减1。1.+i,-i(前置运算)先自增、减,再参与运算。2.i+,i-(后置运算)先参与运算,再自增、减。l
21、自增、减运算符只用于变量,而不能用于常量或表达式。例如:6+,(a+b)+,(-i)+都不合法。逗号运算符逗号运算符,l逗号运算符(顺序求值运算符)。用它将两个或多个表达式连接起来,表示顺序求值(顺序处理)。逗号表达式的求解过程是:自左向右,求解表达式1,求解表达式2,求解表达式n。整个逗号表达式的值是表达式n的值。intx,a;x=(a=3,6*3);printf(%d,%dn,a,x);x=a=3,6*a;printf(%d,%dn,a,x);逻辑运算和关系运算l关系运算符和关系表达式关系运算符和关系表达式l关关系系运运算算是逻辑运算中比较简单的一种。所谓“关关系系运运算算”实际上是“比比
22、较较运运算算”。将两个值进行比较,判断比较的结果是否符合给定的条件。例如,a a3 3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3”条件,因此关系表达式的值为“真”(即“条件满足”);如果a的值为2,不满足“a3”条件,则称关系表达式的值为“假”。n关系运算符及其优先次序关系运算符及其优先次序 C C语言提供语言提供6 6种关系运算符:种关系运算符:n (1)(小于)n (2)(大于)n (4)=(大于或等于)n (5)=(等于)n (6)!=(不等于)n关于优先次序:1前4种关系运算符(,)的优先级别相同,后两种也相同。前4种高于后2种。例如,“”优先于“
23、=”。而“”与“”优先级相同。n 2关系运算符的优先级低于算术运算符。n 3.关系运算符的优先级高于赋值运算符。n 高 低 n算术运算符 关系运算符 赋值运算符n例如:ca+b 等效于 c(a+b)n ab!=c 等效于(ab)!=cna=bc等效于a=(bb)&(xy),(ab)|(xy)。!是单目(元)运算符,只要求有一个运算量,如!(ab)。n 逻辑运算举例如下:n a&b a&b 若若a,ba,b为真,则为真,则a&ba&b为真。为真。n a|b a|b 若若a,ba,b之一为真,则之一为真,则a|ba|b为真为真。n!a !a 若若a a为真,则为真,则!a!a为假为假。n 下表为逻
24、辑运算的“真值表”。用它表示当a和b的值为不同组合时,各种逻辑运算所得到的值。n a b !a !b a&b a|bn T T F F T Tn T F n F T n F F 在一个逻辑表达式中如果包含多个逻辑运算符,如 !a&b|xy&c 优先次序:优先次序:高高 低低 !算术运算符算术运算符关系运算符关系运算符&|&|赋值运算符赋值运算符n!a&b|xy&c可写成:((!a)&b)|(xy)&c)n(ab)&(xy)可写成:ab&xyn(a=b)|(x=y)可写成:a=b|xy n(!a)|(ab)可写成:!a|ab 熟练掌握C语言的关系运算符和逻辑运算符后,可以巧妙地用一个逻辑表达式来
25、表示一个复杂的条件。例如,判别某一年year是否闰年。闰年的条件是符合下面二者之一:能被4整除,但不能被100整除。能被4整除,又能被400整除。可以用一个逻辑表达式来表示:yearyear4 40&year0&year100!=0|year100!=0|year400=0400=0 当year为某一整数值时,上述表达式值为真,则year为闰年;否则为非闰年。可以加一个“!”用来判别非闰年:!(year!(year4 40&year0&year100!=0|year100!=0|year400=0)400=0)若表达式值为真(1),year为非闰年。也可以用下面逻辑表达式判别非闰年:(year
26、year4 4!=0=0)|(yearyear100=0|year100=0|year400400!=0=0)表达式为真,year为非闰年。请注意表达式中右面的括弧内的不同运算符(,!,&、=)的运算优先次序。运算符的优先级与结合性运算符的优先级与结合性 lC语言规定了运算符的“优先级”和“结合性”。在表达式求值时,先按运算符的“优先级别”高低次序执行。如表达式:a-b*c等价于a-(b*c),“*”运算符优先级高于“-”运算符。运算符的优先级与结合性运算符的优先级与结合性l如果在一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。例如:a-b+c,到底是(a-b)+c还是a-
27、(b+c)?(b先与a参与运算还是先于c参与运算?)+/-运算优先级别相同,结合性为“自左向右”,即就是说b先与左边的a结合。所以a-b+c等价于(a-b)+c。结合性结合性l左结合性(自左向右结合方向):运算对象先与左面的运算符结合。l右结合性(自右向左结合方向):运算对象先与右面的运算符结合。在书写多个运算符的表达式时,应当注意各个运算符的优先级,确保表达式中的运算符能以正确的顺序参与运算。对于复杂表达式为了清晰起见可以加圆括号“()”强制规定计算顺序。优先级运算符分类结合性1().从左至右从左至右2!+-*&sizeof单目运单目运算符算符从右至左从右至左3*/%双目运算符 从左至右4+-56=7=!=8&双目运算符从左至右910|11&12|13?:条件运算条件运算符符从右至左从右至左14=+=-=*=/=%=&=|=b)&!c|13.!(a+b)+c-1&b+c/24.a+bc&b=c5.a|b+c&!c|16.!(x=a)&(y=b)&0写出左边各表达式的值
限制150内