![[工学]C语言资料第三章新.ppt_第1页](http://file.renrendoc.com/FileRoot1/2018-12/23/e745f7ad-e772-40ee-b115-baf7091a47b7/e745f7ad-e772-40ee-b115-baf7091a47b71.gif)
![[工学]C语言资料第三章新.ppt_第2页](http://file.renrendoc.com/FileRoot1/2018-12/23/e745f7ad-e772-40ee-b115-baf7091a47b7/e745f7ad-e772-40ee-b115-baf7091a47b72.gif)
![[工学]C语言资料第三章新.ppt_第3页](http://file.renrendoc.com/FileRoot1/2018-12/23/e745f7ad-e772-40ee-b115-baf7091a47b7/e745f7ad-e772-40ee-b115-baf7091a47b73.gif)
![[工学]C语言资料第三章新.ppt_第4页](http://file.renrendoc.com/FileRoot1/2018-12/23/e745f7ad-e772-40ee-b115-baf7091a47b7/e745f7ad-e772-40ee-b115-baf7091a47b74.gif)
![[工学]C语言资料第三章新.ppt_第5页](http://file.renrendoc.com/FileRoot1/2018-12/23/e745f7ad-e772-40ee-b115-baf7091a47b7/e745f7ad-e772-40ee-b115-baf7091a47b75.gif)
已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第三章 数据类型、运算符和表达式,主要内容: C 语言的数据类型 常量与变量 整型数据 浮点型数据 字符型数据 变量赋初值 各类数值型数据间的混合运算 算术运算符和算术表达式 赋值运算符和赋值表达式 逗号运算符和逗号表达式,2,3.1 C语言的数据类型,计算:3*2 数值型数据 在屏幕上显示“我是河科人“ 字符串常量 到“203“房间找某人 指针型数据 学号为101-103的全体学生 数组型数据,算法处理的对象是数据,数据是数据的组织形式即数据结构。不同的数据之间往往存在某些联系。不同的计算机语言使用的数据结构是不相同的。所以,处理同一类问题,如果数据结构不同,算法也会不同。因此, 在程序设计时,应综合考虑算法和数据结构。选择最佳的数据结构和算法。,回顾第二章:,问题的提出:,3,3.1 C的数据类型,数据类型,所有的数据,在进行处理时都需要先存放进计算机的内存中,所以了解不同的数据在计算机中存储的形式是很重要的。,4,3.2 常量与变量,在程序设计中,我们不仅使用到常量,如:123,-90,0.125等,而且我们更多地还要使用变量,因为它们的值在程序的运行中是可以改变的。 本节内容需要了解常量及变量的概念、变量的命名规则。,5,语言字符集 1、英文字母:大小写各26个,共计52个; 2、阿拉伯数:09共10个数字; 3、下划线: _ ; 4、特殊符号:通常指由12个符号组成的运算符。 算术运算符: + - * / % + - 关系运算符: = 条件运算符: ?: 和 = (即赋值运算符) 其他分隔符: ( ) . , ;,一、C语言字符集、标识符和关键字,6,C 语言的标识符,标识符: 用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。标识符就是一个名字。 合法标识符:由字母、数字、下划线组成且第一个字符必须为字母或下划线;不允许超过32个字符。但为了程序的可移植性,建议不要超过8个字符。 例:student_name与student_code是一样的标识符,超过8个的舍去。 用户标识符:去掉32个关键字后的合法标识符.例如:int、float、if等,是C语言的关键字,不能作为用户标识符。,注意: * C语言标识符中大、小字母不通用。例:sum和SUM是两个 不同的标识符。 * C语言规定,保留关键字不能作为用户标识符。 * C语言的保留关键字共有32个见附录B。,7,C 语言的标识符,.不能作标识符,-不能作标识符,不能以数字开头,关键字不能作用户标识符,关键字不能作用户标识符,#不能作标识符,a1,abc.c,a_b,a-b,abc123,3a,int,Int,Len#1,else,合法标识符:_22A,lea_1,avg3,day,ABCde43xyw8 不合法标识符:M.J.YORK,$_238,#xy,a*b,8Tea,判断下列用户标识符的合法性:,8,就是具有特定含义的标识符,用户不能用来作为自定义标识符。由ANSI标准推荐的关键字有32个,常用的有: 与数据类型有关的: char int float double signed unsigned short long void struct union type def enum sizeof 与存储类别有关的: auto extern register static 与程序控制结构有关的: do while for if else switch case default go to continue break return,关键字,9,二、常量与符号常量,常量: 在程序运行过程中,其值不变的量称为常量,如:85,-67,23.7,A,9,“A”等。一般从字面上即可判别,这种常量叫直接常量(字面常量) 。 常量的分类: (1)整型常量 (2)实型常量 (3)字符常量 (4)字符串常量 (5)符号常量。常量的类型,可通过书写形式来判别。 符号常量: 用一个标识符来表示一个常量就叫作符号常量,符号常量的常用预处理命令define来实现,其定义形式为: #define 标识符 常量 例如: #define PI 3.1415,含义为:定义PI为符号常量,其值为3.1415,说明:一般习惯上用大写字母表示符号常量,用小写字母表示变量,以示区别。但仅仅是习惯而不是规定。,10,程序L3-1.C 符号常量的使用,#define PRICE 30 #include main() int num,total; num=10; total=num* PRICE; printf(“total=%dn”,total); ,好处: 1.含义清楚;定义符号常量时,要做到”见名知意”; 2.在需要改变一个常量时,能做到”一改全改”。,说明: 1.程序中的PRICE都代表30 2. 符号常量的值在其作用域内不能改变,也不能再赋值 3. 如果再用PRICE=40给符号常量赋值是错误的,运行结果:total=300,注意:PRICE与30之间不允许有=号。,11,符号常量使用时的注意事项,注意: (1)一般习惯上用大写字母表示,以便与变量区分开(如果用小写字母也可以,只是为了与变量区分,是习惯而不是规定); (2) 定义符号常量时,不能以“;”结束; (3) 一个#define占一行,且要从第一列开始书写; (4) 一个源程序文件中可含有若干个define命令,不同的define命令中指定的“标识符”不能相同;,12,三、 变量,变量: 在程序运行过程中,其值可以改变的量,称为变量。 变量的定义: 类型标识符 标识符1,标识符2,标识符n;,注意事项: (P39) 在选择变量名和其他标识符时,应做到“见名知意”。 不允许是关键字。 要求对变量须进行强制性定义,即必须“先定义、后使用”。 每个变量必须被指定为一种确定类型,以便编译时能为其分配存储单元。,int a,b,c; /* a,b,c 为整型变量 */ float x,y,z; /* x,y,z 为单精度型变量 */,13,三、 变量,变量的组成要素 变量名 变量类型 变量值 例如: int a=15,数据15,内存,通过变量,可以为内存中的位置提供一个有意义的名称,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。 从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。,a,15,14,3.3 数值型数据的表示,一、整型常量 表示形式 十进制整数:与数学上的整数表示相同。如:123,0,-456 八进制整数:以数字0开头, 如: 0123=1*82+2*81+3*80=(83)10 -011即(-11)8=(-9)10 十六进制整数:以数字0和字母x开头, 如:0x123, -0xa2 如: 0x123=1*162+2*161+3*160=(291)10 -0xa2即(-a2)16=(-162)10,* 八进制的数码范围为07; 018 * 十六进制的数码除了数字09外, 还使用英文字母a f (或A F)表示1015。 如:0x1e ,注意!,在VC+ 6.0中数值型数据有两种:整型和实型,15,整数的存储空间为4个字节,即32个二进制位。 取值范围为-231231-1,即-21474836482147483647。,3.3 数值型数据的表示,在VC+ 6.0中数值型数据有两种:整型和实型 一、整型常量,整数(有符号的整数)在内存中存放的是它的补码,无符号数没有符号位,存放的就是原码。整数占用的字节数与机型有关,32位机上占用4个字节。,16,整型数据在内存中的是按它的补码来存放的。 如果要知道一个有符号的整数在内存中的存储形式,一般方法是:,原码反码补码,如果已知内存中的一个二进制编码,还要用相反的方法将其转换成有符号数。,请关注:,17,补充:带符号数在计算机中的表示,整数在计算机中是按补码存储的。 原码:用最高位作符号位,0表示正数,1表示负数;其余各位表示数值的大小。 反码:正数的反码与原码相同,负数的反码是将原码除最高位之外,其它各位按位取反。 补码:正数的补码与原码相同,负数的补码是将反码的最低位加1。,数值数据有带符号数和无符号数之分。,注意:负数的求补码的另一种方法:将该数的绝对值的二进制形式,按位取反再加1。,18,34和-34的8位编码,例如:整数 34 的8位(1字节)编码 原码:00100010 反码:00100010 补码:00100010,例如:整数-34 的8位(1字节)编码 原码:10100010 反码:11011101 补码:11011110,19,34和-34的16位编码,例如:整数 34 的16位(2字节)编码 原码:00000000 00100010 反码:00000000 00100010 补码:00000000 00100010,例如:整数-34 的16位(2字节)编码 原码:10000000 00100010 反码:11111111 11011101 补码:11111111 11011110,20,二、整型变量,在 C 语言中,可以使用整型变量存放一个整型数据,使这个变量的值在程序运行时能够发生变化。每定义一个变量, VC+ 系统就会给该变量分配存储单元,用户可随时改变该存储单元的内容。 但是,若存储单元太大,会浪费存储空间;若存储单元太小,又影响存储的范围和精度。因而,VC +规定了不同类型的整型变量。,3.3 数值型数据的表示,21,1、整型数据在内存中的存放形式 编译系统为整型变量在内存中分配了4个字节的存储单元,数值以补码形式存储。 2、整型变量的分类 整型变量的基本类型符为:int 根据数据所占的二进制位数分为:int,long ,short 同样存储长度的数据又分为:unsigned,signed(隐含) 故可组合出六种类型。,3、整型变量值的范围 由机器中数据的存储长度决定。(见下表),22,整型类型与数值范围,如VC+6.0中,数据长度: short(2字节)int(4字节) =long(4字节) 关键字 所占位数 取值范围 short 16(2B) -3276832767即-215(215-1) unsigned short 16(2B) 065535 即0(216-1) int 32(4B) -231(231-1) unsigned int 32(4B) 0(232-1) long 32(4B) -21474836482147483647 unsigned long 32(4B) 04294967295即0(232-1),如何判断字节数呢?,printf(“%dn“,sizeof(unsigned long int);,23, 如果既不指定unsigned也不指定signed,则隐含为signed,因此存储单元中最高位为符号位(0为正,1为负) 如果指定unsigned,则存储单元中全部二进制位用作存放数值本身。 无符号型变量只能存放不带符号的整数,而不能存放负数。 一个无符号整型变量存放的正数范围比一般有符号整型变量中正数的范围扩大一倍,例如: int a; /*变量a的数值范围为-231 231-1,a的最大值2147483647 */ unsigned int b; /*变量b的数值范围为0 232-1,b的最大值4294967295*/ 思考题: 如果变量a=32767,再加1会出现什么情况?(见下页),注意!,24,整型数据的溢出问题,例3.3 整型数据的计算 #include main() int a,b; a=32767; b=a+1; printf(“%d,%dn”,a,b); 运行结果: 32767,32768,思考:将int b 改为short b,程 序运行后b的值是什么?,25,整型数据的溢出,例3.3” 整型数据的溢出 #include main() int a; short b; a=32767; b=a+1; printf(“%d,%dn”,a,b); 运行结果: 32767,-32768,32767,-32768,如下图: a: b:,注意:此时,32767加1得不到32768,而得到-32768,这2个例子就说明了数据在内存中的存储形式不同,结果会不同!,26,4、整型变量的定义,整型变量的定义形式:,类型标识符 变量名1,变量名2,变量名n;,如: int a,b,c;,long int aa,bb,cc;,long a1,a2;,unsigned u1,u2;,其中int为类型标识符,a,b,c为变量名。,其中long int为类型标识符,aa,bb,cc为变量名。,其中long为类型标识符,a1,a2为变量名。,其中unsigned为类型标识符,u1,u2为变量名。,变量必须“先定义、后使用”。,自己设定,满足标识符的规定。,;不可省,对变量的定义一般是放在一个函数的开头声明部分。,27,程序L3-2.C功能:整型变量的定义及使用,#include main() int a,b,c,d; unsigned u; a=12;b=-24;u=10; c=a+u;d=b+u; printf(“a+u=%d,b+u=%dn”,c,d); 运行结果: a+u=22,b+u=-14,说明:不同种类的整型数据可以进行算术运算!,28,三、整型常量的类型,如果一个整数的值在-231231-1范围内,认为它是int型,可以赋值给int型和long int型变量。 VC+6.0中,分配给long和int的内存空间相同,所以一个int型常量既可赋值给long也可给int型变量。 一个整常量后加一个字母u或U,认为是unsigned int型(即存储单元中最高位不作为符号位,作为数据本身)例如:若写成-12345u,则先将-12345转换成其补码53191,然后按无符号存储。 一个整常量后面加一个字母l或L,认为是long int型。,常量的类型有哪些?如何将整型常量赋给一个整型变量?请注意以下几点:,29,3.4 实型(浮点型)数据,在程序设计中,不仅要使用到各种类型的整数,而且更多地要使用实数。 如:求下面数列的前100项之和:,就必须使用实型数据。,30,一、浮点型常量的表示形式,十进制小数形式:包含整数部分、小数点和小数部分, 如: 0.12,12., 23.0,1.0, .3,-2.5 等。注意:小数点不能省略。 指数形式: “十进制小数” + “e(或E)” “十进制数整数” 。 如:2.7E12,123e+2,2.45e-2分别表示2.71012,123102,2.4510-2 但注意: 小数点不能单独出现; 0. .0 . e或E的两边必须有数字,且e后必须为整数;如:6E0.2 e5 ,例如:e+3、2.03e+0.5、.e3、e 都是非法的实型常量表示方法。,在字母E或e之前的小数部分中,小数点左边应有一位且只能有一位非0的数字,称为“规范化的指数形式”。例:1.23e2是规范化的, 0.0123e2,12.3e1不是规范化指数形式。 一个浮点数在用指数形式输出时,是按规范化的指数形式输出的。,31,二、浮点型变量,变量类型 标识符 存储单元 数值范围 有效数字,单精度 float 4字节(32位) 10-3810+38 67位,双精度 double 8字节 (64位) 10-30810+308 1516位,1、浮点型数据在内存中的存放形式 占4个字节(32位),分为小数部分和指数部分。 小数部分占的位数越多,数的有效数字越多,精度就越高。 指数部分越大(占的位数越多),表示数值范围越大。 如果要求精度特别高,可以采用双精度浮点类型,有效位达16-17位。 2、浮点型变量的分类,32,三、浮点型变量的定义,浮点型变量的定义形式:,类型标识符 变量名1,变量名2,变量名n;,如: float a,b,c;,double a1,a2;,其中float为类型标识符,a,b,c为变量名。,其中double为类型标识符,a1,a2为变量名。,对每一个浮点型变量都应在使用前加以定义,33,四、浮点型数据的舍入误差,例如: #include main() float a,b; a=123456.789e5; b=a+20; printf(“%f n”,b); ,输出结果:12345678848.000000,注意:应避免一个很大的数和一个很小的数直接相加、减,否则会“丢失”小的数。即有效数字以外的数字就不精确了。,34,五、浮点型常量的类型,C语言编译系统常将浮点型常量作为double 型来处理。 例:float f f=2.45678*4523.65 系统先将两数作为double 型,运算之后的结果,取前7位赋给float型的f. 一个浮点型常量可以赋值给float型、double 型变量,那么系统会根据变量的类型截取实型常量中相应的有效位数字。 例:float a; a=11111.111 此时,a只能接收7位有效数字,最后两位小数就不起作用。 如果将a改为double型,则9位有效数字就都存储在变量a中了。,35,3.5 字符型数据,在程序设计中,除了需要使用整型和实型数据之外,还需要另外一种很重要的数据类型,即字符型数据,如姓名,文字信息等,都是字符型数据,也叫文字型数据。 文字型数据有两种类型:单个字符和字符串,36,基本ASCII码表的前32个字符为控制字符(ASCII码值为031)。 接着为标准英文键盘上的每一个字符都规定了一个ASCII码值,字符在内存中的存储格式按照ASCII码值所对应的二进制数确定。,空 格32,00100000,A65,01000001,a97,01100001,b98,01100010,37,一、字符常量,字符常量: 用单引号括起来的一个字符。如: A、e、?等。 由反斜杠()引导的转义字符。如:“n”表换行符。,注意:a与a不同,前者为变量,后者为字符常量。 9与9也不同,前者为整型常量,后者是字符常量。 a与A是不同的字符常量。,每个字符型数据在内存中占一个字节;其存储的内容为该字符在ASCII码表(见附录A)中对应的数值。,38,以“”开头的字符序列称为转义字符,这些字符的含义不是其本身,而是转成了新的意义。,n 换行,将当前位置移到下一行开头 t 换区(横向跳格,跳到下一个输出区,一区占8列) b 退格(删除前面的一个字符) r 回车,将当前位置移到本行开头 代表一个反斜杠字符( ) 代表一个单引号字符 ( ) ” 代表一个双引号字符 (“) ddd 13位8进制数所表示的字符 xhh 12位16进制数所表示的字符,字符形式 功能,39,转义字符的应用举例,printf(“n1234nabcdn“);,printf(“7“);,printf(“nabtcdtefn);,printf(“n1234bn“);,printf(“40n“);,printf(“ x41n“);,1234 abcd,响一声铃声,ab cd ef,123,空格(相当于”040n”)(空格的ASCII码=32), “ A,printf(“abccden”); printf(“101 x56n”),abccde (9个字符),A V (2个字符),重要考点:数字符的个数是关键!,40,二、字符变量,字符变量: 只能存放一个字符并能改变其值的变量。 字符型变量在内存中占1个字节。,字符变量的定义: char 变量名; 例如:char c1,c2,c3,c4;,变量c1,c2,c3,c4 中可存储字符数据、介于-128127的整数或者转义字符。,例如:字符A的ASCII码为: 65D(十进制)=41H(十六进制)=101Q(八进制) 字符A可以表示为A、x41、101。,字符变量分类: char 和 unsigned char;,41,三、字符型数据在内存中的存储形式及使用方法,存储形式: 按 ASCII码存储。,使用方法: 按字符使用(%c):则使用字符本身。 按数值使用(%d):则使用该字符的ASCII码值。,例如a=a,并不是把字符a本身放到内存单元中,而是将该字符的相应的ASCII码97放到内存单元中。,42,四、字符型数据使用方法举例(见P50),例3.6 main( ) char c1,c2,c3=007 ; c1=A; c2=B; printf(“c1=%c,c2=%cn“,c1,c2); printf(“c1=%d,c2=%dn“,c1,c2); printf(“c3=%c,c3=%d n“,c3 ); ,运行结果如下: c1=A,c2=B c1=65,c2=66 一声响,c3=7,但注意:一个字符变量不可以存放一个字符串,所以字符不能用双引号括起来。,43,例3.7 大小写字母的转换,#include main() char c1,c2; c1=a;c2=b; c1=c1-32; c2=c2-32; printf(“%c%c”,c1,c2); ,运行结果: A B,注意字符的相加、字符的运算问题: 1.字符型数据和整型数据之间可以通用,可直接进行算术运算. 2.对字符数据进行算术运算,相当于对它们的ASCII进行算术运算. 3.字符型与数值型可以互相赋值。 4.一个字符数据既可以字符形式输出,也可以整数形式输出.,44,1、VC+将字符变量默认定义为signed char型。其存储单元的最高位为符号位,取值范围是-128127。 2、如果在字符变量中存放一个ASCII码为0127间的字符,由于字节中最高位为0,因此用%d格式输出字符变量时,是一个正整数。 3、如果在字符变量中存放一个ASCII码为128255间的字符,由于字节中最高位为1,因此用%d格式输出字符变量时,是一个负整数。,例如: char c=130; printf(“%d”,c); 结果:-126 字符按有符号处理,例如: unsigned char c=130; printf(“%d”,c); 结果:130 字符按无符号处理,需要说明:,45,五、字符串常量,字符串常量: 一对双引号括起来的字符序列,叫字符串常量,如:“ABCE”、“a”、”A”都是一个字符串常量。,注意: (1)字符串常量不能赋给字符变量。 (2)字符常量与字符串常量不同。,例如:char c1=A; 是可以的, 但 char c1=“A“; 是不合法的。,46,字符串中的字符按照从左到右的顺序,依次存储在一段连续的空间里,其中每一个字符占用一个字节,其内容为该字符在ASCII码表中对应的数值。 注意:C语言的字符串在实际存储时,将自动在字符串尾部加了一个结束标志0(其ASCII码值为0),但0不会输出。 C语言没有专门的字符串变量。如果需要存储字符串的话,须采用字符数组。 试分析:a与”a”相同吗?为什么? 提示:输出的结果相同(0不输出),a,字符串在内存的存储形式:,47,作业(P66),3.6 3.7 3.8,48,总结:常量和变量,常量与符号常量 常量是指在程序运行中,其数值不能被改变的量。 常量又可分为直接常量和符号常量。,49,120 、 -100、 0; 0120、 072; 0xFFFF、 0x1e、0X28AF、0XED4 ; 120L、200L ; 长整型常量 3.14、 -3.1、 5.12E-6 ; a、 #、 n、 101 ; 099、 12f、 0xg、48EA ; 019.5、1e-08; 实型常量只能用十进制形式表示,不能用8,16进制表示 2.1E10.2、 E-6、 6.4E+4.8、 E9 ; “changsha”、 “+?ab” ; 字符串常量 、 p 、 、 ab ;,1、直接常量:是在程序中直接引用的数据。,请判断这些常量正确与否?,注意, p ab 到计算机中,都认为是转义字符,50,2、符号常量 是用标识符来表示一个数据;在程序不能再次给它赋值。 定义形式: #define 标识符 常量数据 例如: #define PI 3.14159 在程序预处理时,凡是出现标识符PI的地方都将用数据3.14159来替换。 如: 2*2.3*PI 就等价于 2*2.3*3.14159。,二、 变量 变量是指以标识符为名字,其值可以改变的量。 变量代表计算机内存中的某一存储空间,该存储空间 中存放的数据就是变量的值。 在同一程序块中,变量不能被重复定义。 使用变量时必须“先定义,后使用”。 变量三要素:变量名,变量类型,变量值,51,存储单元的大小与所表示数值范围的关系,存储单元大小 无符号数范围 有符号数范围 1字节(8位) 0255(28-1) -128127(-2-727-1) 2字节(16位) 065535(216-1) -3276832767(-2-15215-1) 4字节(32位) 0(232-1) - 231(231-1),例如: main() int a,b,c; a=123;b=56; c=a+b; printf(“c=%dn“,c); ,运行结果:c=179,例如:main() int a,b; short c; a=32768;b=2; c=a+b; printf(“c=%dn“,c); ,运行结果:c=-32766 如下图:,例如: main() int a,b,c; a=32768;b=2; c=a+b; printf(“c=%dn“,c); ,运行结果:c=32770,52,32770存入整型变量中的情况,16384+8192+4096+2048+1024+512+128+64+32+16+8+4+2=32766,53,八位二进制编码所表示的有符号数,二进制数 无符号数 原码 反码 补码 00000000 0 +0 +0 +0 00000001 1 +1 +1 +1 01111111 127 +127 +127 +127 10000000 128 -0 -127 -128 10000001 129 -1 -126 -127 11111110 254 -126 -1 -2 11111111 255 -127 -0 -1,54,3.6 变量赋值,变量的初始化: 在定义变量的同时为变量预先设置初值,称为变量的初始化。 如: int a=3; float x=5.89; int a,b,c=8;,在定义一个变量时,系统自动根据变量类型分配了存储空间。但是当变量的值即存储在该空间的值并未给出时,其值可能是随机放入其中的垃圾值,所以变量需要预置一个值,即赋值。 赋值操作通过赋值符号“=”,把右边的值赋给左边的变量。 变量名=表达式 例如:a=3;a=a+1; f=3*4+2;a=43*3+b都是合法的赋值形式。 43*3+b=a 是非法的,55,3.6 变量赋初值,对几个变量赋同一个值,不允许这样赋初值:int a=b=c=8; 可以这样: int a=8,b=8,c=8; 也可以: int a, b, c; a=b=c=8; 注意事项:C语言中,=和= 的区别? 赋值运算符的结合性为从右至左,其优先级低于算术运算符、关系运算符和逻辑运算符。仅高于逗号运算符。 例如:i=j=2+3; 注意事项: (1)在C语言中,“”为赋值运算符号,而不是数学中的”等号”; (2)赋值运算符“”左边必须是变量名,不能是表达式; (3)赋值运算符“”两端的类型不一致时,系统将自动进行类型转换。,见下页,56,3.6 变量赋值的自动类型转换(参见课本P60),如果赋值时两侧类型不一致时,系统将自动进行类型转换: 将整数赋给一个浮点型变量时,系统将保持数值不变并且以浮点小数形式存储到变量中。如 float f; f=12;此时f=12.000000,即先将12转换成12.000000,再存储在f中。 将整型12赋给double型变量f,则f=12.0000000000000 (补足15位)。 将实数赋给一个整型变量时,系统自动舍弃小数部分。如 int a; a=3.9;此时以 a=3的形式存储在整型变量中。 将double型值赋给float型变量,则截取其前面7位有效数字存放。,57,当char型值赋给int型变量时,由于char型数据只占一个字节,而int型占4个字节,则将char型数据放入到int型变量的低8位中,对于int型变量的高8位,不同的系统实现的情况不同,一般当该字符的ASCII值小于127(无论是unsigned还是signed)时,系统将int型变量的高字节置0、低字节存放该字符的ASCII值;例如:int x; x=A; 即x=65 (0000 0000 0000 0000 0000 0000 0100 0001). 若是signed char,最高位又为1,或 ASCII值大于127,系统将整型变量的高字节全补1,即”符号扩展”。 将int、short、long赋给char变量时,只将其低8位原封不动地送到char型变量中。(注意:此时得到的值就不是预想的值) 将int赋给long,不需要进行”符号扩展”,可以互相赋值。,符号扩展: 符号位为0,剩余的高位全补0; 符号位为1,剩余的高位全补1。,3.6 变量赋值的自动类型转换(参见课本P60),58,举例:赋值时类型自动转换示例,#include main() int a,x; float f; a=3.9; f=12; x=A; printf(“a=%d ,f=%f, x=%dn”,a,f,x); ,main() long a=65535; printf(“a=%ldn”,a); printf(“a=%un”,a); printf(“a=%dn”,a); ,运行结果: a=65535 a=65535 a=65535,运行结果: a=3,f=12.000000,x=65,思考:将long改为int,结果怎样?,59,3.7 各类数值型数据间的混合运算,各数据类型之间是可以进行混合运算的,在进行运算时,不同类型的数据要先转换成同一类型,然后才能进行运算。数据类型的级别:,横向箭头表示必须先转成纵向类型才能进行运算,纵向箭头表示当运算对象为不同类型时转换的方向,箭头只表示数据类型级别的高级,不是进行一步步转换,注意:类型转换是系统自动进行的,60,3.7 各类数值型数据间的混合运算,28+32,int,28+32.5,float,28+a,int,double,结果的类型,61,总结自动类型转换,C语言规定,不同类型的数据在参加运算前自动转换成相同类型,再进行运算。转换规则: 表达式中只要有float型或double型,自动转换成double型再运算,结果为double型。 如果表达式中无float型或double型,但是有long型,数据自动转换成long型再运算,结果为long型。 char型和int型运算,先转换为int型,结果为int型。 char型、int型和long型运算,先转换为long型,结果为long 型。除此之外,只要有float型或double型,自动转换成double型再运算,结果为double型。 总而言之:不同类型的数据发生转换时,遵循低级类型向高级类型转换的原则。如:int和double运算,先将int型转换为double型,再进行运算,结果为double型。,62,#include main() float x,y; long m,n; x=3/2+8/3; y=3.0/2+8/3.0; m=1*2*3*4*5*6*7*8*9; n=1L*2*3*4*5*6*7*8*9; printf(“x=%f,y=%f,m=%ld,n=%ldn”,x,y,m,n); 运行结果: x=3.000000,y=4.166667,m=362880,n=362880,例如:自动类型转换,63,回顾前面所讲,C语言的类型修饰符: short、 int 、 long signed、 unsigned short 型的存储长度为2个字节,范围-215215-1。 int ,long int(简写为long)的存储长度为4个字节,范围 -231231-1,用于存储整数超过short int型取值范围的情况。 signed和unsigned适用于char型、int型和long型三种类型,区别在于它们的最高位是否作为符号位。 unsigned char型取值范围0255(即028-1),unsigned int型和unsigned long型取值范围(0232-1)。,64,例如:类型修饰符unsigned的使用,#include main() char a1,b1; unsigned char a2,b2; a1=127;b1=129; a2=127;b2=129; printf(“a1=%d,a2=%u,b1=%d,b2=%un”,a1,a2,b1,b2); 运行结果: a1=127,a2=127,b1=-127,b2=129,说明:127的二进制原码是0111111,+129的二进制码是10000001和-127放在存储器里一个字节的形式相同。 注意:负数在存储器里是按补码形式存储。(-127)补=(10000001)2,65,3.8 运算符和表达式,按操作功能运算符大致可分为:算术运算符、关系运算符、逻辑运算符、按位运算符以及其它运算符如赋值运算符、条件运算符、逗号运算符等。 表达式是由操作数、运算符及括号组成的序列。,算术运算符 + - * / % 关系运算符 = = = != 逻辑运算符 ! & 位运算符 | & 赋值运算符 = *= 条件运算符 ?: 逗号运算符 , 指针运算符 * 和 & 求字节数运算符 sizeof 强制类型转换运算符 分量运算符 下标运算符 ,66,3.8 运算符和表达式,教学要求: 要求掌握运算符的功能,结合性,优先级。 要求掌握数据及运算符组成的表达式的值的判定。 要求熟练运用运算符解决实际问题。,67,C的算术运算符号有三类: 1. 基本算术运算符 2. 强制类型转换运算符 3. 自增、自减运算符 认识运算符,就要掌握每一种运算符号的功能、优先级、结合性。,一、算术运算符和算术表达式,68,1、基本算术运算符,基本算术运算符有五个: + (加) 3+4、 +3 - (减) 3-5、 -5 * (乘) 3*5 / (除) 5/2的值为2;5.0/2的值为2.5;只要分母不为0即可 % (求余) 5%3的值为2; -5%3的值为-2; 5%(-3)的值为2; -5%(-3)的值为-2; 结果的符号与被除数一致. 12.3%3 若a能被b整除,则写:a%b= =0 注意事项: 1.当两个整数相除(/)取整数商,结果取整(舍去小数部分),当运算对象有负数时,结果不定,但一般采用“取整后向零靠拢”的方法 。 2. “ % ” 运算符号的两侧必须为整数,如果不是整型可采用强制类型转换。,例如:5/3=1, -5/3=-1 , 5/-3=-1,-5/-3=1, 2/3=0 , 5/4=1, 2.0/3的结果为0.666667(结果为double型) , 2. 5%3 会出错 ;“/” 运算的数据都是整型数据时,结果为整型,如果有实数,结果为double,69, 用算术运算符和括号将操作数连接起来的式子,叫算术表达式。 优先级:() *、/、% +、- 结合性:从左至右;(即运算对象先与左面的运算符结合) 表达式的值: 数值型(int、long、unsigned、double);,例如: 已知: float a=2.0; int b=6,c=3; 求解: a*b/c-1.5+a+fabs(-5)=?,2、算术表达式,70,float a=2.0; int b =6,c =3; a*b/c -1.5 +a +fabs(-5),12.0/3,5,4.0 - 1.5,2.5 + 97(int),99.5 + 5,104.5(double),思考:a=1.7,b=2.4,计算a+3*-2/(int)(a+b)-12的结果,结果:-11.300000,71,二、强制类型转换运算符,强制类型转换运算符为单目运算符,使用的形式为: (类型名)(转换对象) 功能:将数据类型进行强制转换,但原来变量类型未变化 优先级:仅次于括号类 结合性:自右向左 注意事项:类型名一定要用括号括起来。,例如:(int)(2. 5)%3 的结果为2 ; 因为%两边必须为整型 (float)5/4的结果为1.250000;先将5转换为5.0,再整除 (float)2/3的结果为0.666667;先将2转换为2.0,再整除 float(2/3)则出错; 先整除,结果为0,强制类型转 换后,结果为0.000000 分析:(int)x+y和(int)(x+y)有区别吗?,72,强制类型转换最主要的用途 满足一些运算符对类型的特殊要求,例如:%运算符,要求两侧的数据为整数, (int)(2.5)%3 防止丢失整数除法中的小数部分, 例如: int x=3,y=2; float f; f=(float)x/y; 此时f的值为1.500000。如果不用强制类型转换,即f=x/y,结果为1.000000,73,三、自增、自减运算符,自增、自减运算符主要用于给一个变量加1或减1。 自增、自减运算符:单目运算符。 运算符:+(自增):如a+, +a,都等价于a=a+1. - -(自减): 如a-, -a,都等价于a=a-1 功能:使变量的值自增1或自减1 自增和自减运算符是单目运算符,放到变量前面:前置方式;放到变量后面:后置方式;这两种方式同样实现了变量的自增和自减运算。但结果是不同的。 前置运算时变量先做自增或自减运算,再将变化后的变量值参加整个表达式中的其他运算。后置运算时变量在参加表达式中的其他运算之后,再自增或自减运算。,74,例如:a=3; b=a+; 执行后,b=3,a=4。等价于三条语句: a=3; b=a; a=a+1; 而b=+a;执行后,b=4,a=4。等价于三条语句: a=3; a=a+1; b=a; 例如:a=3;b=a-;执行后结果是:b=3,a=2。等价于三条语句: a=3; b=a; a=a-1; 而b=-a;执行后结果是:b=2,a=2。等价于三条语句: a=3; a=a-1; b=a; 例如:a=3; printf(“%dn”, a+); 输出结果为3,输出后a的值为4。 例如:a=3; printf(“%dn”, +a); 输出结果为4,输出后a的值为4。,75,优先级:仅次于括号类,高于算术运算符,而与负值运算符同级,“+”与”- -“是同优先级别。 + 和- -的结合性:从右向左, 注意:“+”“- -”只能用于变量而不能用于常量和表达式。 例如:i=2; j=-i+; 等价于:j=-(i+); 而不能等价于j=(-i)+; 即: j=-i;i=i+1;所以j的值为-2,i的值为3。 一个变量的前置自增(减)运算和后置增(减)运算仅表明该变量使用其值参加运算与其值自身变化之间的先后关系。即前置时,先自增(减)、后使用。后置时,先使用、后自增(减)。, 注意 “+”或“-”自增与自减运算符的使用。 如:设i=3,k=(i+)+(i+)+(i+),k=? 如:设i=3,j=4,k=i+j,k=? 提示:C编译系统在处理时尽可能多地(自左至右)将若干个字符组成一个运算符,k=9,i=6,k=(i+)+j i=4,j=4,k=7,三、自增、自减运算符,76,#include main() int a1,a2,a3,a4,b1,b2,b3,b4; a1=a2=a3=a4=10; b1=(a1+)+(a1+)+(a1+); b2=(+a2)+(+a2)+(+a2); b3= (a3-)+(a3-)+(a3-); b4=(-a4)+(-a4)+(-a4); printf(“a1=%d, a2=%d, b1=%d, b2=%dn”,a1,a2,b1,b2); printf(“a3=%d, a4=%d, b3=%d, b4=%dn”,a3,a4,b3,b4); 运行结果:a1=13,a2=13,b1=30,b2=39 a3=7,a4=7,b3=30,b4=21,三、自增、自减运算符,/*先算+,得到a2=13,然后3个a2相加*/,/*先将3个a1相加得到b1,然后在算+,得到a1*/,调试程序,一般像 i+ + +i, +j + +j 这些 undefined behavior,还是避免的好,不要依赖特定编译器的实现。结果与编译器有关,没必要太深入研究,只要知道左结合和右结合是怎么回事就行了。,注意:,77,3.9 赋值运算符和赋值表达式,赋
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《红楼梦》中风辣子初见林黛玉
- 房地产设计部工作总结
- 联通运维工作总结
- 高级职称评审汇报
- 《皎皎空中孤月轮》课件
- IT业务合作计划保密协议7篇
- 《画》这首诗的课件
- 2025购房合同标准范本示例
- 骨科负压引流患者的护理
- 2025年项目经理临时借用合同范文
- 食品执行标准对照新版表
- 大班科学《神奇的洞洞》课件
- 第二次全国陆生野生动物资源调查技术规程
- 控制计划CP模板
- 最新苏教牛津译林版英语五年级上册Unit 4《Hobbies》Grammar time 公开课课件
- 《民用航空法》考试复习题库100题(含答案)
- 路面压浆施工方案
- 第8课时 主题阅读《雨的四季》-2022-2023学年七年级语文上册(部编版)
- Linux基础入门培训
- 现场技术服务报告模版
- 完整课件-西方经济学下册(第二版)
评论
0/150
提交评论