基本数据类型表达式与运算符.ppt

上传人:牧羊曲112 文档编号:5952287 上传时间:2023-09-08 格式:PPT 页数:83 大小:381.50KB
返回 下载 相关 举报
基本数据类型表达式与运算符.ppt_第1页
第1页 / 共83页
基本数据类型表达式与运算符.ppt_第2页
第2页 / 共83页
基本数据类型表达式与运算符.ppt_第3页
第3页 / 共83页
基本数据类型表达式与运算符.ppt_第4页
第4页 / 共83页
基本数据类型表达式与运算符.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《基本数据类型表达式与运算符.ppt》由会员分享,可在线阅读,更多相关《基本数据类型表达式与运算符.ppt(83页珍藏版)》请在三一办公上搜索。

1、1,第二章 基本数据类型、运算符与表达式,2,本章要求:C语言的数据类型各种类型数据的定义方法常量与变量各种类型数据的混合运算强制类型变换重点:数据类型;数据的定义方法;各种类型数据的混合运算,3,2.1 C语言的数据类型,C语言支持的数据类型非常丰富,它包括:基本数据类型,构造数据类型,指针类型,空类型四大类,4,2.2 常量、变量和标识符,对于基本数据类型量,根据其取值是否可改变可分为常量和变量两种。1.常量,常量:其值不发生改变的量称为常量。常量可与数据类型结合起来分类。例如,整型常量、实型常量、字符型常量、字符串常量和符号常量。在编程过程中,常量是可以不经说明而直接引用的,而变量则必须

2、要先定义后使用。常用常量如下所示:整型常量:25、0、-7;实型常量:5.6、-6.9;字符常量:a、b。,5,2.标识符,标识符是用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:#define 标识符 常量其中#define也是一条预处理命令(预处理命令都以#开头),称为宏定义命令其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。一般习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。,6,例2.1符号常量的使用。,

3、程序运行结果:area=300程序分析:使用符号常量参与运算,符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。使用符号常量的好处是:含意清楚;能做到“一改全改”。,7,3.变量,变量,其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。变量在使用之前必须进行定义即为每个变量取一个名称(变量名),同时规定它的数据类型,以便编译时根据数据类型分配存储空间。C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须是字母或者下划线。下面标识符的写法是合法的,可以作为变量名使用。Sum,Class_2,data,wang_ming,_high,a8

4、,AREA,year_month_day下面是不合法的标识符和变量名:*data1,99sum,%yuan,$BGss,MR.tom,a1b1,s/t注意,编译系统区分大小写,将它们认为是两个不同的字符。所以,max和MAX是两个不同的变量。,8,注意,建议变量名的长度最好不要超过8个字符。在选择变量名和其它标识符时应“见名知意”。要求对所有用到的变量作强制定义,也就是“先定义,后使用”。变量定义一般放在函数体的开头部分。要区分变量名和变量值是两个不同的概念。,9,变量名实际上就是以一个名字对应,代表一个地址。在对程序编译连接时由编译系统给每个变量名分配对应的内存地址。变量在定义时必须指定其数

5、据类型,以便在编译时为其分配存储单元。,|&a 2500H|2501H|-1250-a=1250&b2502H|2503H|-2504H|-123.67-b=123.67 2505H|-2506H|变量名、变量值、变量地址间的关系,例如:int a=1250;float b=123.67;,10,4.变量赋初值,C语言中可有多种方法为变量提供初值。可以在变量定义的同时给变量赋以初值的方法。这种方法称为初始化。在变量定义中赋初值的一般形式为:类型说明符 变量1=值1,变量2=值2,;例如:int a=68;/*指定a为整型变量,初值为68*/也可以使被定义的变量的一部分赋初值。例如float b

6、,c,d=7.9;上式指定b,c,d为单精度实型变量,只对d初始化,其值为7.9。如果对几个变量赋予相同的初值,应写为:int e=50,f=50,g=50;,11,例2.2部分初始化数据,程序运行结果:a=6,b=14,c=8程序分析:对定义的整型变量进行部分初始化,然后参与运算,并输出结果。,12,5.变量的地址,在定义了一个变量后,在内存中会分配相应的存储单元,将变量的值存储到该单元中。如前所述注意区分变量名和变量值这两个不同的概念。例如:int x;float y;x=3;y=3.14159;,13,2.3简单数据类型与表示范围,2.3.1 整型数据1.整型常量的表示方法整型常量就是整

7、常数。在语言中,经常使用的整常数有三种进制,它们分别是八进制、十六进制和十进制。八进制前缀为“0”,十六进制前缀为“0 x”,十进制无前缀。(1)十进制整数。如:123,-456.4。(2)八进制整数。以0头的数是八进制数。如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。,14,(3)十六进制整数。以0 x开头的数是16进制数。如:0 x123,代表16进制数123,等于十进制数 291。-0 x12等于十进制数18。(4)整型常数的后缀:基本整型的长度为16位,十进制无符号整常数的范围为065535,有符号数为-32768+32767。八进制无符

8、号数的表示范围为00177777。十六进制无符号数的表示范围为0X00XFFFF或0 x00 xffff。如果使用的数超过了上述范围,就必须加上后缀“L”或“l”变为长整型数来表示。例如:567L(十进制为567)注意:长整数567L和基本整常数567在数值上并无区别,但是所占存储空间大小不同。对567L而言,因为是长整型量,编译系统将为它分配4个字节存储空间。而对567,因是基本整型,则只分配2个字节的存储空间。,15,2.整型变量,(1)整型数据在内存中的存放形式数据在计算机内存中是以二进制形式存放的,例如,定义了一个整型变量a:int a;/*定义a为整型变量*/a=11;/*给a附以初

9、值11*/由于在内存中数值是以补码表示的,正整数的补码和它的原码在二进制形式上是相同的。所以,a11,在内存中的存放形式如下所示。,16,负数的补码:将该数的绝对值的二进制形式按位取反后再加1。例如:求-11的补码:,符号位,(2)整型的分类,基本型:类型说明符为int,在内存中占2个字节。短整量:类型说明符为short int或short。所占字节和取值范围均与基本型相同。长整型:类型说明符为long int或long,在内存中占4个字节。,17,有符号型:类型说明符为signed;无符号型:类型说明符为unsigned。有符号型与无符号型又可与前三种类型匹配而构成:,上面带 的部分表示其内

10、容可以省略,18,(3)整型变量的定义,变量定义的格式为:类型说明符 变量名标识符,变量名标识符,.;说明:允许在一个类型说明符后,定义多个相同类型的变 量,并使用逗号分割变量名中多个变量,使用分号结 束。类型说明符与变量名之间至少用一个空格间隔。变量定义必须放在变量使用之前。一般放在函数体的开头部分。在程序的同一部分,禁止对同一变量进行重复定义,在书写不同种类型变量定义时,避免都写在一行上。对所用到的变量必须进行强制定义,即“先定义,后使用”。int a,b,c;/*a,b,c为整型变量*/long x,y;/*x,y为长整型变量*/,19,例2.3整型变量的定义与使用,程序运行结果:b=x

11、+a=-1,sum=12,average=6,20,(4)整型数据的溢出,每个整型数据都有其自身的数据类型,有其自身所占存储空间大小,基本整型int定义的变量的最大允许存储值为32767,例3.4整型数据的溢出,程序运行结果:32767,-32768,程序分析:计算结果-32768与实际应该的结果32768相差一个符号,为什么呢?数据在内存中都是以该数的补码的二进制形式存放的,32767的补码为0111 1111 1111 1111,加1后发生进位,变成1000 0000 0000 0000,最高位的1占据了符号位,而它正好是-32768的补码形式,所以才有上述输出结果。,21,实型数据,1实

12、型数据表示方法 实型也称为浮点型。语言中,实数有二种形式:十进制小数形式和指数形式。十进制数形式:由数字09和小数点组成。注意,必须有小数点,且小数点的前面或后面必须有数字。例如:3.1415926,0.0、0.1、7.0、780.、-25.860等均为合法的实数。指数形式:由十进制数(基数)、加阶码标志“e”或“E”以及指数(阶码,只能为整数,可以带符号)组成。其一般形式为:a E n(a为十进制数基数,n为十进制整数阶码)其值为 a*10n。如:1.6E2(等于1.6*102)注意:阶码标志e(或E)之前必须有数字,且e后的指数必须为整数。,22,2.实型数据在内存中的存放形式,实型数据一

13、般占4个字节(32位)内存空间。与整型数据的存储方式不同,系统把一个实型数据分为小数部分和指数部分分别存放。指数部分采用规范化的指数形式表示。例如,实数7.15731在内存中的存放形式如下:,图中是用十进制形式来表示的,实际上计算机中是用二进制来表示小数部分,以及用2的幂次来表示指数部分的。,.715731(101)0.715731,23,3.实型变量的分类,实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)三类。,实型变量定义,例如:float x,y;/*x,y为单精度实型量*/double a,b,c;/*a,b,c为双精度实型量*/lo

14、ng double z;/*z为长双精度实型量*/,24,4.实型数据的舍入误差,由于实型变量的存储单元能提供的有效数字总是有限的,其中单精度的有效数字是7为,双精度的是16位。在有效位数之外的数字将被舍去,因此会产生误差。,例2.5 实型数据的舍入误差。,程序运行结果:7654321152.000000,7654321152.000000,“f”是输出实数的制定格式。结果中xy,单精度的x较33大的多,其有效位数是7位,超过此范围的数字是无意义的。Turbo C 规定小数后最多保留六位。应避免这种被“忽视”的情况发生。,25,5.实型常数的类型,实型常数不分单、双精度,都按双精度double

15、型处理。例如定义一个实型变量a,进行如下运算:a3.14159*7.1617编译系统先将3.14159和7.1617作为双精度数进行相乘的运算,得到的结果也是双精度的,然后取其前7位有效数字赋值给实型变量a。这样,可以使计算的结果更加精确。,26,2.3.3 字符型数据和字符串常量,字符型数据包括字符常量和字符变量。1.字符常量字符常量是用一对单引号括起来的一个字符。例如:x、d、=、!等都是合法字符常量。注意:d和D是两个不同的字符常量。注意:字符常量只能是单个字符,不能是字符串。字符可以是字符集中除了单引号本身“”、双引号“”、反斜杠“”外的任意字符。但数字被定义为字符型之后就不能参与数值

16、运算。如6和6 是不同的。6是字符常量,不能参与运算。,例,a,A,1abc、“a”,27,2.转义字符,转义字符以反斜线“”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符的原意,故称“转义”字符。如,输出函数中用到的“n”其意义是“回车换行”C语言中,转义字符有三种:简单转义字符、八进制转义字符和十六进制转义字符。,n 换行 t 横向跳格(水平制表8列)r 回车 反斜杠 单引号”双引号 ddd ddd表示1到3位八进制数字xhh hh表示1到2位十六进制数字,28,例2.6 转义字符的使用。,程序运行结果:fgcde,程序分析:注意:转义字符的作用。首先在左端输出“abc”,然

17、后遇到“t”,它的作用是跳到下一个制表符位置;一个制表符占8列,下一制表符位置从第9列开始,故在第910列上输出“de”;然后遇到“r”,它代表“回车”(不换行),于是返回到本行的行首(最左端第1列),输出“f”;然后遇到“b”,它代表“退一格”,接着输出“g”。,程序运行时的输出结果为:fabgcde但显示器上看到的结果与上述结果不同,为:fgcde中间的字符被后续字符取代了。,29,3.字符变量字符变量用来存储字符常量,它只能存放一个字符。字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。例如:char a,b;4.在内存中的存储形式每个字符变量被分配一个字

18、节的内存空间,字符型数据在存储时,并不是把该字符本身放到内存单元中,而是把该字符的ASCII码值存放在变量的内存单元之中的。例如:A的十进制ASCII码是65,a的十进制ASCII码是97,30,在内存单元中存放的是65和97的二进制代码:,字符型数据在内存中是以ASCII码存放的,它的存储形式与整数的存储形式类似。使得字符型数据和整型数据之间可以通用。语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。,31,例2.7 向字符变量与整型数据通用,程序运行结果:a,A 65,97,a,b值的输出形式取决于printf函数格

19、式串中的格式符,当格式符为%c时,对应输出的变量值为字符,当格式符为%d时,对应输出的变量值为整数。由此可知,字符型数据和整型数据是可以通用的,但要注意字符型数据只占一个字节,它只能存放0-255范围的整数。,32,例2.8 大小写字母的转换,程序运行结果:A,b65,98,a,b为字符变量并赋予字符值,语言允许字符变量参与数值运算,即用字符的ASCII码值参与运算。大小写字母的ASCII 码值相差32,因此可以将小写字母与大写字母进行相互转换,然后分别以字符型和整型输出。,33,5.字符串常量,字符常量是用一对单引号括起来的一个字符,而字符串常量则是由一对双引号括起的字符序列。例如:“cho

20、ngqing”,“C program”,“&1.75”,“a”等都是合法的字符串常量。字符串常量和字符常量是不同的量。它们之间的主要区别如下:外形不同,字符常量由一对单引号括起来,字符串常量由一对双引号括起来。注意,a和a是不同的。内容不同,字符常量只能是单个字符,字符串常量则可以含一个或多个字符。单向赋值,可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。空间不同,字符常量占一个字节的内存空间,字符串常量占的内存字节数等于字符串中字节数加1。末尾增加的一个字节用于存放字符串结束的标志字符0(ASCII码为0)。,34,字符串 chongqing 的长度是9个字节,在

21、内存中所占的字节为10,其存储方式如下图所示:,最后一个字符为0,在输出时是不会输出0的。注意在书写程序时不必加0,0是系统自动加上的。字符常量a和字符串常量a虽然都只有一个字符,但在内存中的情况是不同的。a在内存中占一个字节,a在内存中占二个字节。,35,2.3.4 各数据类型间的混合运算,整型(包括int,short,long)、浮点型(包括float,double)可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算.转换的原则就是为了两个运算对象的计算结果尽可能提供多的存储空间。当运算符两端的运算对象的数据类型不一致时,在运算前先将类型等级较低的数据转换成等级较高

22、的数据保值转换。,上述的类型转换是由系统自动进行的.,横向向左的箭头表示必定的转换,纵向的箭头表示数据类型级别的高低,实际运算时不需逐级转换,可由级别低的直接转换为级别高的。,36,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。,例3.9 数据类型转换,程序运行结果:s=78,PI为实型;s,r为整型。在执行s=r*r*PI语句时,r和PI都转换成double型计算,结果也为double型。但由于s为整型,故赋值结果仍为整型,舍去了小数部分。,37,2.3.5 简单数据类型

23、的表示范围,38,2.3.6 数据的简单输出,将数据结果展示出来,必须使用输出语句,所谓输入输出是以计算机为主体而言的。在语言中,所有的数据输入输出都是由库函数完成的。在使用语言库函数时,要用预编译命令#include将有关“头文件”包括到源文件中。使用标准输入输出库函数时要用到“stdio.h”文件,因此源文件开头应有以下预编译命令:#include 或#include stdio.h“stdio是standard input&outupt的英文缩写,其意思是标准输入输出。,39,printf函数调用的一般形式为:printf(格式控制字符串,输出表列)其中“格式控制字符串”用于指定输出格式

24、。“格式控制字符串”可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:“%d”表示按十进制整型输出;“%ld”表示按十进制长整型输出;“%c”表示按字符型输出等。“%f”表示按小数形式输出单、双精度实数非格式字符串在输出时原样照印,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。,40,例2.10 数据输出,程序运行结果:68 8068,80D,Pa=68,b=80 x is 3.140000,输出第一句中,在两%d 之间加了一个空格(非格式字符),

25、所以输出的a,b值之间有一个空格。第二句中加入的是非格式字符逗号,因此输出的a,b间加了一个逗号。第三句要求按字符型输出a,b值。第四句中为了提示输出结果又增加了非格式字符串。第五句的格式串要求按实型输出,其他非格式字符按原型输出。,41,2.4 C语言的运算符与表达式,2.4.1 C语言运算符简介1.运算符C语言的运算符可分为算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、逗号运算符及一些特殊的运算符。按运算符与运算对象(操作数)的关系可将C语言的运算符分为单目运算符、双目运算符和三目运算符。单目运算符是指运算符只需要一个操作数,如!,+,-等;双目运算符是指运算符需要

26、两个操作数,即运算符的左右两侧都需要一个操作数,如+,-,*,/,等;三目运算符是指运算符需要三个操作数,如条件运算符?:。,42,语言的运算符可分为以下几类:算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(+)、自减(-)共七种。关系运算符:用于比较运算。包括大于()、小于(=)、小于等于()赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,=,=,=)条件运算符:这是一个三目运算符,用于条件求值(?:)。逗号运算符:用于把若干表达式组合成一个表达式(,)。指针运算符

27、:用于取内容(*)和取地址(&)二种运算。求字节数运算符:用于计算数据类型所占的字节数(sizeof)。强制类型转换运算符:强制进行数据类型转换(类型)。分量运算符:用于存取结构和联合中的成员(,.),其优先级在所有运算符中是最高的。下标运算符:用于数组下标的表示().其他运算符:如函数调用运算符(())。,43,2.表达式表达式是使用运算符和圆括号将操作数连接起来构成的式子。C语言的操作数包括常量、变量、函数值等。例如:表达式(x-y)/(3*a+b)-6*d中包括+,-,/,*等运算符,操作数包括x,y,a,b,3等。语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。3.

28、简单语句C语言中,在表达式的末尾加上一个分号“;”就构成了简单语句。在程序设计过程中要避免使用无意义的简单语句。,44,1.赋值运算符赋值就是将一个数据值存储到一个变量中。注意,赋值的对象只能是变量,而这个数据值既可以是常量,也可以是变量,还可以是有确定值的表达式。赋值运算符记为“=”,其作用是将一个数据赋给一个变量。例如,“a3;”其作用是执行一次赋值操作,表示将常量3赋给变量a。2.赋值表达式由赋值运算符“=”将一个变量和表达式连接的式子称为赋值表达式。其一般形式为:变量=表达式例如:x=sin(a)+(i+);,赋值运算符和赋值表达式,45,对赋值表达式求解的过程是:求赋值运算符右侧的“

29、表达式”的值;赋给赋值运算符左侧的变量。例如:赋值表达式“=3*5”的值为15,执行表达式后,变量a的值也是15。,注意:一个表达式应该有一个值,46,左值(lvalue):赋值运算符左侧的标识符变量可以作为左值;而表达式就不能作为左值(如a+b);常变量也不能作为左值,,右值(rvalue):出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。,赋值表达式中的“表达式”,又可以是一个赋值表达式.例如:a=(b=5),分析:括弧内的“b=5”是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”相当于执行“b=5”和“ab”两个赋值表达式。赋值运算符按

30、照“自右而左”的结合顺序,因此,“(b5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价,最后a5。,47,请分析下面的赋值表达式(a=3*5)=4*3,分析:先执行括弧内的运算,将15赋给a,然后执行4*3的运算,得12,再把12赋给a。最后a的值为12,整个表达式的值为12。可以看到(a=3*5)出现在赋值运算符的左侧,因此赋值表达式(a=3*5)是左值,注意:在对赋值表达式(a=3*5)求解后,变量a得到值15,执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变量a,而不是赋给3*5。,不能写成:a=3*5=4*3,48,将赋值表达式作为表达式的一种,使赋值操作

31、不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中.如:printf(%d,a=b);,分析:如果b的值为3,则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。,49,3.类型转换,如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:(1)整型数与实型数之间的转换将实型数据(单、双精度)赋予整型变量时,舍去实型数据的小数部分。例如:整型变量i,执行“i=3.14”的结果是使得i的值为3,以整数形式存储在内存中。将整型数据赋给实型(单、双精度)变量时,数值不变,但以实型数

32、据形式存储在内存中,即增加小数部分(小数部分的值为0)。,50,(2)实型数据之间的转换将一个double型数据赋给float型变量时,截取其前7位有效数字,存放到float型变量的存储单元(32位)中。注意,数值范围不能溢出。例如:float a;double b=123.456789e100;a=b;便会出现溢出错误。将一个float型数据赋给double型变量时,其数值不变,有效位数扩展到16位,在内存中以64位存储。,51,(3)整型数与字符型数之间的转换字符型数据赋给整型变量时,由于字符型只占一个字节,而整型占二个字节,故将字符的ASCII码值放到整型量的低八位中,这时有两种情况:如

33、所用系统将字符型数据处理为无符号型的量或对unsigned int型变量赋值,则将字符型数据(8位二进制位)放到整型变量的低8位,高8位补为0。例如将字符376(代表图形字符“”,其ASCII码值为254)赋给int型变量a,如下图所示。,52,如所用系统(如Turbo C+3.0)将字符型数据处理为带符号型的量(即signed char),如字符最高位为0,则整型变量高8位补0;如字符最高位为1,则高8位全补1,见下图所示。这称为“符号扩展”,这样做的目的是使数值保持不变,如上述字符/376以整数形式输出为2,a的值也是2。,53,将一个int、short、long型数据赋给一个char型变

34、量时,只将其低8位原封不动地送到char型变量(截断)。例如:int a=291;char b=c;b=a;赋值情况见下图所示,字符变量b的值为35,如用“c”格式输出b,将得到字符“”(其ASCII为35)。,54,(4)整型数据之间的转换如将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中。如int型数据为正值(符号位为0),则long型变量的高16位补0;如int型变量为负值(符号位为1),则long型变量的高16位补1,以保证数值不改变。如将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到int

35、型变量(截断)。例如:int x;long y=9;x=y;赋值情况如下图所示,,55,如果y=65536(八进制数0200000),则在赋值后x值为0,如下图所示。,56,(5)无符号整数与其他整数之间的转换将一个unsigned int类型数据赋给一个与其长度相同的整型变量(如unsigned intint,unsigned longlong,unsigned shortshort)时,将unsigned型变量的内容原样送到非unsigned型变量中,即进行原样复制;但如果数据范围超过相应整型的范围,则会出现数据错误。例如:unsigned int x=65535;int y;y=x;将x

36、整个送到y中,如下图所示。由于y是int型,第1位是符号位,因此y成了负数。根据补码指数可知,y的值为1,可以用printf(%d,b)来验证。,57,将非unsigned 型数据赋值给长度相同的unsigned型变量,也是原样赋值(连原有的符号也作为数值一起传递),,58,例2.11 有符号数据送给无符号变量,程序运行结果:65535程序分析:赋值情况如下图所示,不同类型的整型数据间的赋值归根结底就是一条,按存储单元中的存储形式直接传送。,59,4.复合赋值运算符,除了基本赋值运算符外,C语言还提供了另外十种复合运算符。它们就是在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=,-

37、=,*=,=,%=,=,&=,=,|=。这些运算符把“运算”和“赋值”两个操作结合在一起称之为复合赋值运算符。采用复合赋值运算符可提高代码执行效率。构成复合赋值表达式的一般形式为:变量 双目运算符=表达式它等效于:变量=变量 运算符 表达式即将左边的(变量)与右边的(表达式)进行(双目运算符)所规定的运算,然后将值返回给变量。例如 x*=y+38 等价于x=x*(y+38),60,为便于记忆,可以这样理解:x+=y(其中x为变量,y为表达式)x+=y(将有下划线的“x+”移到“=”右侧)|_ x=x+y(在“=”左侧补上变量名a)注意:如y是包含若干项的表达式,则相当于它有括号。对赋值表达式a

38、+=a=a*a,如果a的初值为3,则此赋值表达式求解步骤如下:先进行“a=a*a”的运算,它相当于a=aa*a,a的值为396。再进行“a+=6”的运算,相当于a=a+(6),a的值为6612。,61,2.4.3 强制类型转换符,强制类型转换符就是“()”,它是单目运算符,它把表达式的类型强制类型转换成圆括号中的“数据类型名”所指定的类型。强制类型转换又称为显示转换。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如:(int)a/*把a转换为整型*/(float)(x+y)/*把x+y的结果转换为实型*/,62,使用强制转换时应注意以下问题

39、:类型说明符和表达式都必须加括号,单个变量可以不加括号。例如,不要把(int)a,写成int(a)。上式(float)(x+y)如写成float x+y则只是将x转换成实型,再与y相加。无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。例如,(int)a,如a原指定为float型,则进行强制类型转换后,得到一个int型的中间变量,它的值等于a的整数部分,而a的类型不变,仍为float型。,63,例2.12 强制类型转换,程序运行结果:x=3,a=3.140000程序分析:本例表明,a虽强制转为int型,但只在运算中起作

40、用,是临时的,而a本身的类型并不改变(仍为float型)。因此,(int)f的值为3(删去了小数)而f的值仍为3.14。,64,算术运算符和算术表达式,(1)基本的算术运算符:(加法运算符,或正值运算符。如:、)(减法运算符,或负值运算符。如:、)*(乘法运算符。如:*)(除法运算符。如:)(模运算符,或称求余运算符,两侧均应为整型数据,如:的值为),65,使用上述运算符时需要注意几点:两整数相除,结果为整数(舍去小数部分),商向下取整。如,20/7,的结果为2,3/4的结果为0。但是,如果除数或被除数中有一个为负数,则舍入的方向是不固定的。例如,5/3,有的机器上得到结果1,有的机器上得到结

41、果2。多数机器采取“向零取整”的方法,即5/31,取整后向零靠拢。如参与+,*,/运算的两个数中有一个为实型,则结果为double型,因为实型都按dounle型进行处理。取摸运算符实际上就是数学运算中的求余运算符,它要求参与运算的两个操作对象均为整型。求余运算的结果等于两数相除后的余数,结果的符号与左边的操作数的符号相同。例如,203的结果为2,458的结果为5(其中“”为负值运算符),458的结果为5。,66,例2.13 除法及求余运算,程序运行结果:2,-22.857143,-2.8571431程序分析:第一条输出说明除法运算中两操作数均为整数时其结果为整数,如操作数中出现负数,其结果向零

42、取整。第二条输出说明除法运算中两操作数中有一个为实数,其结果为double型。第三条输出说明取模运算是得到两除数的余数,结果符号与左边的操作数的符号相同。,67,2.4.5 自增自减运算符,1.自增自减运算符在C语言中提供了两个特殊的运算符:自增运算符“+”和自减运算符“”。自增运算符“+”,其功能是使变量的值自增1。自减运算符“”,其功能是使变量值自减1。它们均为单目运算,都具有右结合性,可以出现在运算符的前面或后面。有以下几种形式:+i i自增1后再参与其它运算。i i自减1后再参与其它运算。i+i参与运算后,i的值再自增1。i i参与运算后,i的值再自减1。注意区分“+”(或“”)出现在

43、运算变量的前面还是后面,这决定着变量使用前进行加(减)操作,还是使用后进行加(减)的操作。,68,如i的初值为3,则j=+i是先执行i加1后,再把i的值4赋给j,最终i和j的值均为4;而ki+是先把i的值3赋给k后,再执行i加1,最终k的值为3,i的值为4。使用自增、自减运算符时,需注意以下几点:自增运算符(+)和自减运算符(),只能用于变量,而不能用于常量或表达式。例如,+26或(a-b)+是不合法的。自增、自减运算符是单目运算符,其优先级高于基本的算术运算符,与单目运算符“”(取负)的优先级相同,其结合方向是“自右至左”。,69,例2.14 自增自减运算,程序运行结果:9889-8-9,程

44、序分析:i的初值为8,输出语句第1行i加1后输出故为9;输出语句第2行减1后输出故为8;第3行输出i为8之后再加1(为9);第4行输出i为9之后再减1(为8);第5行输出-8之后再加1(为9),第7行输出-9之后再减1(为8)。注意,i+和i之前的“”为负值运算符,因此按照结合性这两个表达式相当于(i+)和(i)。,70,2.表达式使用中的问题说明,ANSI C并没有具体规定表达式中的子表达式的求值顺序,允许各编译系统自己安排。例如:对表达式 a=f1()+f2()并不是所有的编译系统都先调用f1(),然后调用f2()。在有的情况下结果可能不同。有时会出现一些令人容易搞混的问题,因此务必要小心

45、谨慎。调用先后顺序不同,结果可能不同。语言中有的运算符为一个字符,有的运算符由两个字符组成,为避免误解,最好采取大家都能理解的写法。例如:不要写成a+b的形式,而应写成(a+)+b的形式,71,2.4.6 位运算符、位运算表达式,前面介绍的各种运算都是以字节作为最基本位进行的。语言中,提供了位运算的功能,这使得语言也能像汇编语言一样用来编写系统程序。C语言提供了6种位运算符,可分为两类:位逻辑运算符和移位运算符。,位逻辑运算符有4种,它们是:&按位与|按位或 按位异或 取反 移位运算符有2种,它们是:右移,72,1.字节和位在计算机中内存是以字节为单位的连续的存储空间,每个内存单元(字节byt

46、e)有一个唯一的编号,即地址。一个字节一般由8个二进制位(bit)组成,其中最右边的一位称为“最低位”,最左边的一位称为“最高位”。每个二进制位的值是0或1。2.数值的编码表示在计算机内表示数值的时候,以最高位为符号位,最高位为0表示数值为正,为1表示数值为负。表示数值的编码一般由:原码、反码、补码。(1)原码用最高位为符号位来表示数值的符号:最高位为0表示正数,最高位为1表示为负数,其余各位代表数值本身的绝对值(二进制)。,73,如:+11的原码是:0000101111的原码是:10001011注意,0的原码有两种不同的表示,+0的原码是00000000,0的原码是10000000。由于0的

47、表示方法不唯一,不适合计算机的运算,所以计算机内部一般不使用原码来表示数据。(2)反码正数的反码与原码相同,如+11的反码也是00001011;而负数的反码是:原码除符号位外(仍为1),各位取反。例如:11的反码是:11110100+0的反码是:000000000的反码是:11111111同样,0的表示方法不唯一,所以计算机内部一般也不用反码来表示数据。,74,(3)补码正数的补码与原码相同,如+11的补码同样是00001011,而负数的补码是:除最高位仍为1外,原码的其余各位求反,然后再加1。例如:11的原码是:10001011,求反(除最高位外)后,得11110100,再加1,结果是111

48、10101。+0的补码是:000000000的补码是其反码11111111加1,得100000000,最高位溢出,剩下00000000。所以,用补码形式表示数值0时,是唯一的,都是00000000。目前计算机通常都是以补码形式存放数据。因为采用编码形式不仅数值表示唯一,而且能将符号位与其他位进行统一加以处理,为硬件实现提供方便。,75,逗号运算符和逗号表达式,在语言中,逗号“,”的用途主要有两种:一种是作为运算符,一种是作为分隔符。用逗号把两个表达式连接起来,称为逗号表达式(又称顺序求值运算符)。逗号运算符的优先级别最低。1.逗号作为运算符逗号表达式的一般形式为:表达式1,表达式2其求值过程是

49、先求表达式1的值,再求表达式2的值,并以表达式2的值作为整个逗号表达式的值。例:逗号表达式“126,9+8”的值为17。,76,逗号表达式:i3*5,i*2因为,逗号表达式中表达式1中的赋值运算符的优先级高于逗号运算符的优先级。它的求解过程为:先求解i3*5,经计算和赋值后得到i的值为15,然后求解i*2得30,整个表达式的值为30。逗号表达式的扩展形式为:表达式1,表达式2,表达式3,表达式n逗号表达式的值为表达式n的值。因为逗号运算符的优先级是所有运算符中级别最低的,因此,下面两个表达式是不同的:j(i3*5,i*2)ji3*5,i*2式是一个赋值表达式,将一个逗号表达式的值赋给j,j的值

50、为30;而 式是个逗号表达式,它包括一个赋值表达式和一个算术表达式,j和i的值都是15,整个表达式的值为30。,77,2.逗号作为分隔符逗号除了作为运算符外,还可以作为分隔符,作为C语言的标点符号之一,用来分隔开相应的多个数据。如在定义变量时,具有相同类型的多个变量可在同一行中定义,其间用逗号隔开:int a,b,c;例如:printf(%f,%f,%f,(x,y,z),y,z);则“(x,y,z)”是一个逗号表达式,它的值等于z的值。括号内的逗号不是参数间的分隔符,而是逗号运算符。括号中的内容是一个整体,作为printf函数的一个参数。,78,例2.15 逗号运算符,程序运行结果:y6,x6

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号