C语言第3章(谭浩强).ppt

上传人:wuy****n92 文档编号:70105013 上传时间:2023-01-16 格式:PPT 页数:77 大小:660.50KB
返回 下载 相关 举报
C语言第3章(谭浩强).ppt_第1页
第1页 / 共77页
C语言第3章(谭浩强).ppt_第2页
第2页 / 共77页
点击查看更多>>
资源描述

《C语言第3章(谭浩强).ppt》由会员分享,可在线阅读,更多相关《C语言第3章(谭浩强).ppt(77页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第三章数据类型、运算符第三章数据类型、运算符 与表达式与表达式 13.1 C 的数据类型的数据类型算算法法处处理理的的对对象象是是数数据据,而而数数据据是是以以某某种种特特定定的的形式存在的。所谓数据结构指的是数据的组织形式。形式存在的。所谓数据结构指的是数据的组织形式。所有的程序设计必需有两个问题待解决:所有的程序设计必需有两个问题待解决:1、数据描述、数据描述2、操作步骤、操作步骤就象厨师做菜一样,没有原材料就无法做出菜来。就象厨师做菜一样,没有原材料就无法做出菜来。在在C语言中编程序也是要先定义数据常量、变量,与语言中编程序也是要先定义数据常量、变量,与PASCAL相同,其主要原因是在内

2、存中事先预留出地相同,其主要原因是在内存中事先预留出地方以便使用。方以便使用。233.2 常量与变量 n一、常量和符号常量:n常量:在程序运行的过程中,不能被改变的量称为常量。n整型常量:12、0、-8n实型常量:4.6、1.23、-0.9n字符型常量:a、B、其中为定界符,而不是字符型常量的一部分。n也可以用一个标识符代表一个常量4如:P38例3.1符号常量:#define PRICE 30n这是一种编译预处理,叫做“宏定义”。指定PRICE代替30,在以后的程序中遇到PRICE即用30代替,这种用一个标识符代代表表一一个个常常量量,称称为为符符号号常常量量。它不属于C语句,所以不必在末尾加

3、上“;”。其作用域在文件结束或遇#undef处结束。n一般格式为:#define 符号常量 常量n优点:含义清楚、改动方便5二、变量:n在程序运行过程中,其值能被改变的量。一个变量有一个名字,占一定的存储单元,在该存储单元中存储变量的值。(如在教室上课的学生)n1、每个变量都有两个特点:一是变量的名字;二是每个变量值都占据一块内存单元。n如:P39图3-1n变量名 变量值n教室名 学生n a 36和和其其它它语语言言一一样样,所所有有变变量量名名、符符号号常常量量名名、函函数数名名、数数组组名名、类类型型名名、文文件件名名的的有有效效字字符符序序列列被被称称为标识符(为标识符(identifi

4、er)。)。C语言规定标识符只能由字母、数字、下划线三种语言规定标识符只能由字母、数字、下划线三种字符组成,且第一个字符必须为字母或下划线。字符组成,且第一个字符必须为字母或下划线。72 2、变量起名原则、变量起名原则:n变量所起的名字不可与变量所起的名字不可与32个保留字重名个保留字重名n必必须须以以字字母母或或下下划划线线开开头头,由由字字母母、数数字字或或下下划划线线组组成成的的长长度度为为8的的字字符符串串。(Turbo C允许有允许有32个字符)个字符)例例:有有两两个个变变量量,student-name和和 student-number,因因二二者者的的前前八八个个字字符符相同,所

5、以系统认为它们是一个变量。相同,所以系统认为它们是一个变量。n应应本本着着见见名名知知义义的的原原则则。常常见见初初学学者者有有起起a1,b,a2等等等等。名名字字虽虽不不影影响响程程序序的的运运行行,但但可可读读性性不不好好,或或起起成成app_num,可以猜到是表示苹果数。可以猜到是表示苹果数。8n大大写写字字母母与与小小写写字字母母意意义义不不同同,被被认认为为是是两两个个不不同同的的字字符符。一一般般变变量名用小写字母表示。量名用小写字母表示。n注意:常量名常用大写、变量名常用小写!nyear Day a_12 _abcdefn#123 .com$100 1999Y a=b 1_2_3

6、 +abcedfghi -5 等等93、变量要先定义后使用、变量要先定义后使用n要要用用到到的的变变量量,必必须须先先对对其其进进行行定定义义,才才可可以以使使用用。如如果果是是未未经经定定义义的变量,在编译时会检查出来。的变量,在编译时会检查出来。n定义变量时指定变量的类型,在编译时准备为其分配相应的存储单元。另外,还可在编译时检查该变量所做运算是否合法。n如:int a,b,c;103.3 整型数据 n一、整型常量的表示方法一、整型常量的表示方法1、十进制整数:239、-103等。每个数位都可以是0-9。2、八进制整数:以0开头,(128)10=0200。即(200)8每数位都可以是0-7

7、。-011表示十进制-9。3、十六进制整数:以0 x开头,(291)10=(123)16。每数位都可以是0-9、A-F。注:1、二进制、八进制、十六进制转换成十进制方法:按权相加2、十进制转换成二进制、八进制、十六进制方法:连续除以基数,从低到高记录余数,直至商为011二、整型变量二、整型变量n1、整型变量在内存中的存放形式:数据在内存中是以二进制形式存放。每一个整型变量在内存中占两个字节。如:int i=10;n在计算机基础中应该学过补码,数值在内存中应以其补码形式存放的。而而正正数数的的补补码码和和其其原原码相同。负数的补码是按位取反再加码相同。负数的补码是按位取反再加1。n例如10、-1

8、0:n10的补码和-10的补码:n十进制数10 的二进制形式为1010,12132、整型变量的分类n根据数值的范围,整型变量类型分为:1)基本整型,以int表示 2)短整型,以short表示 3)长整型,以long表示n在C中,为了更精确描述整型数据,又进一步分为六种类型,区别主要是在表示整数的范围不同。具体见下表:14类型类型名称名称位数位数取值范围取值范围Signed int基本整型 16-215-(215-1)-32768+32767 Short int 短整型 16-32768+32767 Long int 长整型 32-231-(231-1)-21亿+21亿Unsinged int

9、无符号整型 16 0-(216-1)065535 Unsinged short int 无符号短整型 16 065535 Unsinged long int 无符号长整型 32 0-(232-1)042亿 150 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1=32767有符号整型:符号位无符号整型:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1=65535数据位见P43图3-5163、整型变量的定义、整型变量的定义 nint a,b;(定义两个整型变量a和b)nunsigned short c,d,f;(定义三个无符号短整型变量c、d、f)nlong e;(定义一

10、个长整型变量)n格式应为:变量1,变量2,变量3变量n;n一般应在函数一开始就进行定义。n例如下列程序:17nvoid main()void main()n nint a,b,c,d;unsigned u;int a,b,c,d;unsigned u;na=12;b=-24;u=10;a=12;b=-24;u=10;nc=a+u;d=b+u;c=a+u;d=b+u;nprintf(“a+u=%d,b+u=%dn”,c,d);printf(“a+u=%d,b+u=%dn”,c,d);n n运行结果:运行结果:a+u=22,b+u=-14 a+u=22,b+u=-14 n结论:不同类型的整型数据可

11、以进行算结论:不同类型的整型数据可以进行算术运算。术运算。184、整型数据的溢出、整型数据的溢出n在运算的过程中,若变量的值超过该类型的范围,则会产生溢出。n例:例:void main()void main()n int a,b;int a,b;n a=32767;b=a+1;a=32767;b=a+1;n printf(“%d,%d”,a,b);printf(“%d,%d”,a,b);n 运行结果为:运行结果为:3276732767,-32768-32768 19把变量b改为long型,a+1改为a+1L,并用%ld格式输出,即可得b为3276820三、如何判断整型常量的类型三、如何判断整型

12、常量的类型n若若在在-3276832767-3276832767之之间间,可可认认为为是是intint或或shortshort型,型,longlong型。型。n若超出了若超出了-3276832767-3276832767,而在,而在 -2147483648+2147483647-2147483648+2147483647之之间间,则则认认为为是是longlong。若若认认为为是是intint类类型型的的,系系统不做检查,但数据会丢失。统不做检查,但数据会丢失。21n如如果果使使用用的的C C语语言言版版本本分分配配给给shortshort和和intint数数据据的长度相同,则可以互相赋值给变量

13、;的长度相同,则可以互相赋值给变量;n针针对对常常量量unsignedunsigned型型,一一个个非非负负值值的的整整数数可可以以赋赋值值给给unsignedunsigned型型变变量量,注注意意其其范范围围。5000050000可可赋赋给给unsigned unsigned intint型型,7000070000却却不不可可以以。为为什什么么?(无符号整型变量最大值无符号整型变量最大值 65535.)65535.)n如如一一整整型型常常量量后后有有U U或或u u,则则认认为为是是unsigned unsigned int,int,例例如如123u123u在在内内存存中中按按unsigne

14、d unsigned intint的的方方式式存存放和参加计算的;放和参加计算的;n如如一一整整型型常常量量后后有有L L或或l l,则则表表示示为为long long intint型型的。如的。如123L123L。常用于函数的调用中。常用于函数的调用中。22一、浮点型常量的表示方法n1、十进制小数形式:n由整数部分、小数点和小数部分组成。n例如:1.24 0.345 234.0 0.0 等。n2、指数形式:由实数部分、指数部分、E(e)组成。用于表示一些比较大、比较小的数值。3.4 浮点型数据浮点型数据232、指数形式、指数形式n例如:123*1022=123E22n注意:E之之前前必必须须

15、要要有有数数字字,E之之后后数数字字必须为整数。必须为整数。ne12 4.4e1.5 .e5都是不合法的。n对于123.456有以下几种表示方法:n123.456e0 12.3456e11.23456e2 0.123456e30.0123456e40.00123456e5等。其中1.23456e2为“规范化的指数形式”。其小数点前只能有一位非零的数字。24二、浮点型变量一个浮点型数据在内存中占4个字节、32位。n1、浮点型数据在内存中的存放形式 与整型数据不同,浮点型数据是按照指数形式存储的。系统把数据分成小数部分和指数部分,分别进行存放。n如3.1415926的存放w实际上,计算机是用二进制

16、存放数据,而浮点型数据占4个字节(32位),其中多少位存放小数部分,多少位存放指数部分并没规定,但一般C的编译系统用24位存小数和符号,用8位存指数。w 存放小数部分的位数越多,有效数字越多。而存放指数部分的位数越多,能表示数值的范围越大。252、浮点型变量的分类、浮点型变量的分类类型类型名称名称位数位数有效有效数字数字数值范围数值范围float 单精度单精度 32 6-7-3.4*10-373.4*1038 double 双精度双精度64 15-16-1.7*10-3081.7*10308 long double 长双精度长双精度 128 18-19-1.2*10-49321.2*10493

17、2以上的有效位数和数值范围适用于Turbo C、Turbo C+、MS C,不同系统会有差异。263、浮点型数据的舍入误差、浮点型数据的舍入误差 由于浮点型变量的存储单元是有限的,所以由于浮点型变量的存储单元是有限的,所以超过有效位的数字会被舍去,由此就会产生误差。超过有效位的数字会被舍去,由此就会产生误差。例例3.4:voidmain()floata,b;a=123456.789e5;b=a+20;printf(“b=%f”,b);voidmain()floatx;x=7.1234567890;printf(“x=%.18f”,x);27n 这这就就说说明明,一一个个浮浮点点型型常常量量赋赋

18、值值给给一一个个浮浮点点型型变变量量时时,只只根根据据浮浮点点型型变变量量表表示示的的有有效效数数字字的的位位数数,在在浮浮点点型型常常量量中中按按从从左左向向右右的的方方向向截截取取数数据据。float型型的的变变量量只只能能保保存存7位位有有效效数数字字,double型型的的变变量量只只能能保保存存15-16位位有有效数字。效数字。28三、浮点型常量的类型三、浮点型常量的类型 一一个个浮浮点点型型常常量量可可以以赋赋给给一一个个float型型、double型型、long double型型的的变变量量,系系统统根根据据变变量量的的类类型型截截取取实实型型常常量量中中有有效效的的数数字字。C语

19、语言言编编译译系系统统一一般般将将浮浮点点型型常常量量作作为为double型型来来处处理。理。例如:float a;a=111111.111(最后两位没有意义,可以改为double型)nvoid main()void main()nfloat x;double y;float x;double y;nx=123456.789;y=123456.789;x=123456.789;y=123456.789;nprintf(“%f,%f”,x,y);printf(“%f,%f”,x,y);n结果为:结果为:n123456.789062,123456.789000123456.789062,12345

20、6.789000293.5 字符型数据字符型数据一、字符常量n1、在在C语语言言中中字字符符型型常常量量是是用用单单引引号号括括起来的一个字符起来的一个字符。如:a、A、3、?、$等。n2 2、以以“”“”开开头头的的转转义义字字符符,如如nn不不代代表字母表字母n n,而是代表换行。,而是代表换行。30如:101。八进制101等于十进制65,根据ASCII码表得出101代表字母A31例转义字符的使用例转义字符的使用main()printf(“ab ct derftgn”);printf(“htibbjkn”);运行运行结果:果:f gdeh jk32二、字符变量二、字符变量n一个字符变量只能

21、存放一个(不能是字符串)字符常量nchar c1,c2;char c1,c2;nc1=a;c2=b;c1=a;c2=b;n在内存中占一个字节的空间。33三、字符数据在内存中的存储形式n系系统统在在表表示示一一个个字字符符数数据据时时,并并不不是是将将字字符符本本身身的的形形状状存存入入内内存存,而而只只是是将将字字符符的的ASCIIASCII码码存存入入内内存存。在在内内存存中中所所有有的的数据又是以二进制的形式存放的。数据又是以二进制的形式存放的。n如如P50P50图图3-83-8n例例如如字字符符aa的的ASCIIASCII码码为为9797,bb的的ASCIIASCII码为码为9898。3

22、4n例如例如3.63.6:向字符变量赋予整数:向字符变量赋予整数n void main()void main()n char c1,c2;char c1,c2;n c1=97;c2=98;c1=97;c2=98;n printf(“%c,%cn”,c1,c2);printf(“%c,%cn”,c1,c2);n printf(“%d,%dn”,c1,c2);printf(“%d,%dn”,c1,c2);n 结果为结果为:a,bn 97,98n说说明明:字字符符型型数数据据和和整整型型数数据据是是通通用用的的,但但是是字字符符型只占一个字节,只能存放型只占一个字节,只能存放0255内的整数。内的整

23、数。35例3.7 大小写字母转换#includeVoid main()Char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;Printf(“%c%c”,c1,c2);结果:A B36n例如:整型和字符型变量可以相互赋值:例如:整型和字符型变量可以相互赋值:n main()main()n int i;char c;int i;char c;n i=a;i=a;n c=97;c=97;n printf(“printf(“c=c=%c,%c,c=c=%dn”,c,c);%dn”,c,c);n printf(“printf(“i=i=%c,%c,i=i=%dn”,i,i);%d

24、n”,i,i);执行结果为:c=a c=a,c=97c=97 i=a i=a,i=97i=97结结论论:一一个个字字符符型型数数据据,既既可可以以字字符符形形式式输输出出,也也可可以以整整数数形形式式输输出出。也也就就是是字字符符型型和和整整型型数数据据可可以以进进行行换换算算。但但是是字字符符数数据据只只占占一一个个字字节节,它它只只能能存存放放-128-127范范围中整数。围中整数。37n说明:TC中将字符变量定义为signed char型,所以存储单元中的最高位应该为符号位,那么它的取值范围就是-128-127(一个字节),在用%d格式输出时,ASCII码在0-127之间的会输出一个整数

25、。如果字符变量中存放的是ASCII码在128-255之间的字符,会得到一个负数。例如:n main()n char c=130;n printf(“%d,”,c);n结果为:-126解决办法:可以把字符变量定义为unsigned char型,其取值范围是0-255.38四、字符串常量n字符串常量是由双引号括起来的字符序列字符串常量是由双引号括起来的字符序列。n如:“how do you do”,“CHINA”,“a”,“4+3”,“$134323.54”n “a”和和a是不同的。是不同的。n究竟区别在哪里呢?n在C中,每一个字符串常量的结尾处系统会自动加一个“字符串结束标志”(0,它占一个字节

26、的宽度)表明字符串结束。n所以:na在内存中只占一个字节的宽度,而“a”在内存中占两字节的宽度。39字符串变量n在在C语语言言中中没没有有专专门门的的字字符符串串变变量量来来存存放放字字符符串串常常量量,须须用用字字符符数数组组来来存存放放。这将在第这将在第7章章 数组中介绍。数组中介绍。n关于变量的总结:关于变量的总结:int a,s;整型 float x,y;实型 char c,d;字符型403.6 变量赋初值程序中常需要对一些变量预先设置初始值。41一、什么是对变量赋初值n(C语言允许在定义同时赋初始值)。变量赋初值就是在定义变量的同时,给变量赋一个值。这个变量产生后第一次被赋值,所以叫

27、赋初值。n如:int a=3;n float x=5.56;n char c1=a;42二、如何进行赋初值n对变量赋初值只要在定义的时候用赋值运算符赋给该变量一个值就行。n例如:例如:int m=1,x=3;int m=1,x=3;n float y=4.6;float y=4.6;n char z=a;char z=a;43三、在赋初值过程中的问题n1、可以把变量的一部分赋初值;如nint x,y,z=3;n注注意意:此此时时只只有有z=3z=3,而而x,yx,y没没有有初初值值,其其初初值值也也不不是是0 0,而而是是一一个个不不确确定定的的值值,这这个个值值在在该该变变量量所所能能表表示

28、示的的数数值值范范围围内内,具具体体是是多多少少我我们们不不知知道道。如如果果此此时时使使用用该该变变量量,系系统统不不会会检检查查、提提示示,而而直直接接使使用用其其中中那那个不确定的值,会出错的。个不确定的值,会出错的。如:如:int xint x,y,z=3;相当于如下两个语句:相当于如下两个语句:n int x,y,z;int x,y,z;n z=3;z=3;44三、在赋初值过程中的问题n2、如果给几个变量赋同一个值;nint a=b=c=3a=b=c=3;这种写法是不正确的。不能表示a、b、c的初值都是3。n可写成:nint a=3,b=3,c=3;a=3,b=3,c=3;n或者:n

29、int a,b,c;n a=b=c=3;a=b=c=3;n注意:初始化不是在编译阶段完成的,注意:初始化不是在编译阶段完成的,而是在运行时赋予初值的。而是在运行时赋予初值的。453.7 各类数值型数据间的混合运算一一、为什么各类型的数据可以进行混合运算n我们前面已经讲过,字符型数据在内存中是按数值方式存放的。而整型数据和实型数据肯定也是按数值方式存放的。在这种前提下,这三种类型的数据实际上是可以进行混合运算的。就象生活中,3块5再加2块一样(这里说的是人民币3.5元加2元)。但是应该有一个运算原则。46二、如何在各类型的数据之间进行混合运算n我们已经知道,不同类型的数据可以进行混合运算,但是还

30、要遵循一个原则:在在运运算算过过程程中中,不不同同的的数数据据类类型型要要先先转转换换成成同同一一类类型型后后,才才能能进进行行运运算算。转换规则在书中P54图3-10。n在类型转换图中,级别越高的类型,它在内存中占的字节数越多。47n1 1、水水平平向向左左箭箭头头:这这种种水水平平方方向向上上的的转转换换是是在在任任何何时时候候都都要要进进行行的的,就就算算两两个个charchar类类型型的的数数据据进进行行运运算算,也也要要先转换成整型数据再运算先转换成整型数据再运算n2 2、竖竖向向箭箭头头:在在进进行行了了水水平平方方向向上上的的转转换换后后,如如果果仍仍然然存存在在不不同同类类型型

31、的的数数据据,就就要要进进行行纵纵向向的的类类型型转转换换。转转换换方方向向为为由由下下向向上上,由由低低级级向向高高级级靠靠拢拢,运运算算结结果果的的类类型型和和式式子子中中最最高高级级别别的的类类型型是是一一样样的的。如如两两个个类类型型的的最最高高型是型是longlong,低的类型就要转换为,低的类型就要转换为longlong型。型。char、shortdoublefloatlongunsignedint高低48n例例如如:int和和double的的数数据据进进行行运运算算,那那么么要要将将整整型型数数据据转转换换为为双双精精度度型型数数据据后后再再进进行行运运算算。运运算算结结果果将将

32、是是双双精精度度型型的的数数据据。(注注意意:int直直接接转转换换成成double,中间的类型跳过中间的类型跳过)49例:例:nint i;int i;nfloat f;float f;ndouble d;double d;nlong e;long e;n10+a+i*f-d/e10+a+i*f-d/en所所有有的的类类型型转转换换过过程程都都是是由由系系统统自自动动进行的。进行的。503.8 算术运算符和算术表达式n1、C算术运算符 +加法运算符或正值运算符 -减法运算符或负值运算符 *乘法运算符 /除法运算符%模运算符或称求余运算符 51n注意:注意:1 1、使使用用“/”“/”时时注注

33、意意:如如果果运运算算符符两两边边的的数数据据为为整整型型,那那么么得得到到的的结结果果也也必必是是整整 型型,5/2=25/2=2,1/5=01/5=0,而而 不不 是是 0.20.2,1.0/5=0.21.0/5=0.2。另另外外,如如果果其其中中一一数数是是负负数数,舍舍入入的的值值不不固固定定,得得到到的的值值也也不不固固定定。如如:-5/3-5/3可可以以得得到到-1-1和和-2-2两两值值,TC2.0TC2.0采采取取“向零取整向零取整”法得到法得到-1-1。2 2、使使用用“%”“%”时时注注意意:该该运运算算符符的的两两边边只只能是整型数据。如:能是整型数据。如:7%47%4的

34、数值为的数值为3 3。522、算术表达式和运算符的优先级与结合性n(1)、算术表达式定义:n用用算算术术运运算算符符号号和和括括号号将将运运算算对对象象(也也称称操操作作数数)连连接接起起来来的的、符符合合C语语法法规规则则的式子,称为算术表达式。的式子,称为算术表达式。其其中中:运运算算对对象象包包括括常常量量、变变量量、函函数数等。等。n例如:例如:3+4.5*a-b*4/33+4.5*a-b*4/3 a*b/c-1.5+aa*b/c-1.5+a53(2)、优先级和结合性n在C语言中规定,对表达式求值时,按运算符的优先级别高低,从高到低进行运算。另外,C语言中还规定了运算符的结合性,算术运

35、算符的结合方向是“从左至右”又称为“左结合性”。n如:a+b*cn不是所有的运算符的结合性都是从左至右,有的是从右至左的,称“右结合性”。n在书中附录c中P365中表明。543、强制类型转换运算符n可以利用强制类型转换运算符将一个表达式转换成所需类型。例如:(floatfloat)x x (int)x+y (int)x+y (int)(x+y)(int)(x+y)(float)(5%3)(float)(5%3)其格式为:(类型)(表达式)(类型)(表达式)55n注注意意:在在强强制制类类型型转转换换时时,产产生生的的是是一一个个临临时时数数据据,这这个个临临时时数数据据的的类类型型是是指指定定

36、的的类类型型,而而原原始始数数据据的的类型不会发生改变。类型不会发生改变。n void main()void main()n float x;float x;n int y;x=3.6;int y;x=3.6;n y=(int)x;y=(int)x;n printf(“%f,%d”,x,y);printf(“%f,%d”,x,y);运行结果为:运行结果为:3.600000,33.600000,356n讲讲到到这这里里,我我们们已已经经知知道道:在在C C语语言言中中有有两两种种形形式式的的类类型型转转换换(且且只只有有两两种种),一一种种是是系系统统自自动动进进行行的的类类型型转转换换,如如5

37、*0.65*0.6;另另一一种种是是强强制制类类型型转转换换,象象(int)x%8(int)x%8。n在在上上面面这这个个例例子子中中%运运算算符符要要求求两两个个运运算算数数都都为为整整型型,如如果果有有一一个个运运算算数数不不是是整整型型,那那么么系系统统将将报报错错。这这种种情情况况下下,如如果果变变量量x x不不是是整整型型,那那么么必必须须使使用用强强制制类类型转换。型转换。574、自增、自减运算符(+、-)n+是是自自增增运运算算符符。+k+k或或k+k+都都是是让让变变量量k k的值加的值加1 1。n-是是自自减减运运算算符符。-k-k或或k-k-都都是是让让变变量量k k的值减

38、的值减1 1。区别:区别:n+K+K含义:先执行含义:先执行K=K+1K=K+1,再使用,再使用K K值。值。nK+K+含义:先使用含义:先使用K K值后,再执行值后,再执行K=K+1K=K+1。58n例如:例如:k=1;k=1;k=1;k=1;j=+k;j=k+;j=+k;j=k+;左边左边k k先变成先变成2 2,j=2 j=2 右边右边k k为为1 1,j=1j=1然后然后K K为为2 2。n总之,自增、自减运算符都有两种用法:总之,自增、自减运算符都有两种用法:(1 1)前置运算)前置运算运算符放在变量之前运算符放在变量之前如:如:+变量、变量变量、变量先使变量的值增(或减),然后再以

39、变化后先使变量的值增(或减),然后再以变化后的值参与其它运算,即的值参与其它运算,即先增减、后运算先增减、后运算。(2 2)后置运算)后置运算运算符放在变量之后运算符放在变量之后如:如变量、变量如:如变量、变量变量先参与其它运算,然后再使变量的值增变量先参与其它运算,然后再使变量的值增(或减),即(或减),即先运算、后增减先运算、后增减。59自增、自减运算符自增、自减运算符使用中的问题说明(1 1)这这两两种种运运算算符符只只能能用用于于变变量量,而而不不能能用于常量或表达式。如:用于常量或表达式。如:2+2+或(或(a+ba+b)+(2 2)+、-运运算算符符的的优优先先级级相相同同,比比算

40、算术运算符优先级要高。其结合性是术运算符优先级要高。其结合性是“从右至左从右至左”的。的。-i+-i+相当于相当于-(i+i+)。)。i=3;i=3;=3;=3;j=-i+;j=-i+;m=+m=+;printf(“%d”,j);printf(“%d”,j);结果是:结果是:-3-3 printf(“%d”,m);printf(“%d”,m);结果是:结果是:4 4 60例:例:void main()void main()int x=6,y;int x=6,y;printf(x=%dn,x);/*printf(x=%dn,x);/*输出输出x x的初值的初值*/*/y=+x;y=+x;/*/*

41、前置运算前置运算*/*/printf(“x=%d,y=%dn,x,y);printf(“x=%d,y=%dn,x,y);y=x-;y=x-;/*/*后置运算后置运算*/*/printf(x=%d,y=%dn,x,y);printf(x=%d,y=%dn,x,y);运行结果:运行结果:x=6 x=6 x=7,y=7x=7,y=7 x=6,y=7 x=6,y=7 615、注意程序的写法n 在在调调用用函函数数是是有有的的系系统统是是自自左左至至右右,有有的的是是自自右至左。右至左。n=3;=3;Printf(“%d,%d”,Printf(“%d,%d”,+);+);n结果为:结果为:3 3,3 3

42、(有的系统左至右)(有的系统左至右)4 4,3 3(多数系统右至左)(多数系统右至左)最好写成:最好写成:=3;=3;j=j=+;+;printf(“%d,%d”,j,printf(“%d,%d”,j,););n结果为:结果为:3 3,4 4 62如果的初值为如果的初值为(i+)+(i+)+(i+)有的系统:有的系统:有的系统:有的系统:为了避免歧义性写成:为了避免歧义性写成:i=3;i=3;a=i+;a=i+;b=i+;b=i+;c=i+;c=i+;d=a+b+c;d=a+b+c;任何系统结果都一样。任何系统结果都一样。63n如 i+jnC多数是自左到右的处理,所以它理解为(i+)+j,而不

43、是i+(+j)。n最好不要用这种易产生歧义的表达。643.9 赋值运算符和赋值 表达式651、赋值运算符、赋值运算符n “=”就是赋值运算符。就是赋值运算符。n 格式:变量格式:变量=表达式表达式n 赋值过程中遇到的问题:赋值过程中遇到的问题:n如果赋值运算符两侧的变量和表达式的如果赋值运算符两侧的变量和表达式的类型都为数值型时,系统自动进行类型类型都为数值型时,系统自动进行类型转换。怎么转换呢?有一个原则,要尽转换。怎么转换呢?有一个原则,要尽量保持赋值前后数据的一致性。我们来量保持赋值前后数据的一致性。我们来分别看一下分别看一下:662、类型转换、类型转换n(1)将实数赋给整数时舍去小数点

44、。将实数赋给整数时舍去小数点。n 如如i=3.12n(2)将整数赋给实数时后面加将整数赋给实数时后面加0。n(3)将将double型数据赋给型数据赋给float变量时,截取前变量时,截取前7位有效数字,存到位有效数字,存到float变量中。变量中。n 如:如:float f;n double d=123.456789e100;n f=d;n(4)字符型赋给整数时,如果系统把字符处理为无符号的字符类型,)字符型赋给整数时,如果系统把字符处理为无符号的字符类型,则将字符的则将字符的8位,放在整数的低位,放在整数的低8位,高位,高8位补零;如果系统把字符处理位补零;如果系统把字符处理为有符号的,若字

45、符的最高位为为有符号的,若字符的最高位为0,则整数的高,则整数的高8位全为位全为0,若字符的最,若字符的最高位为高位为1,则整数的高,则整数的高8位全为位全为1。这称为。这称为“符号扩展符号扩展”,是为了保证数,是为了保证数值不变。值不变。n(5)将)将int,short,long 型数据赋给型数据赋给char 型变量时,只将其低型变量时,只将其低8位原位原封不动地送到封不动地送到 char中,称为中,称为“截断截断”。n(6)把带符号的整型数据赋给)把带符号的整型数据赋给long型时,要符号扩展,把整型的型时,要符号扩展,把整型的16位位放到放到Long的低的低16位,如果是正数,高位,如果

46、是正数,高16位补位补0,如果是负数,高,如果是负数,高16位位补补1。以保证数值不变。以保证数值不变。n(7)把)把unsigned int型数据赋给型数据赋给long int时,只需把高位补时,只需把高位补0。n(8)把非)把非unsigned型数据赋给长度相同的型数据赋给长度相同的unsigned型,只需原样赋型,只需原样赋值,如果有符号也作为数值一起传送。如例值,如果有符号也作为数值一起传送。如例3.9 6768693、复合的赋值运算符、复合的赋值运算符n定义:在赋值运算符之前加上其它运算符。定义:在赋值运算符之前加上其它运算符。例如:例如:x+=3x+=3相当于相当于x=x+3x=x

47、+3 x*=(y+z)x*=(y+z)相当于相当于x=x*(y+z)x=x*(y+z)n所所以以A+=BA+=B解解释释为为:将将“A+”“A+”移移到到“=”“=”右右侧侧得得到到“=A+B”“=A+B”,然然后后在在左左侧侧添添上上“A”“A”就就得得到到了了“A=A+B”“A=A+B”。n共有共有1010种复合运算符:种复合运算符:+=+=、-=-=、*=*=、/=/=、%=%=、=、&=&=、=、|=|=(其其中中后后五五种种是是位位运运算算的的运运算算符符,在位运算那章介绍。在位运算那章介绍。)70四、赋值表达式四、赋值表达式格式:格式:赋值表达式的求解过程:赋值表达式的求解过程:先

48、先求求赋赋值值运运算算符符右右侧侧的的表表达达式式的的值值(右右值值),再再赋赋给给赋赋值值运运算算符符左左侧侧的的变变量量(左左值值)。不不是是所所有有对对象象都都可可以以作作左左值值,变变量量可可以以,表表达达式式却却不不可可以以(如如a+b),注注意意,凡凡是是左左值都能作右值。值都能作右值。如:如:a=3;a=b;a+b=3;71a=b=5 相当与相当与a=(b=5)a=5+(c=6)/*a=11,c=6*/x=(y=4)+(z=3)/*x=7,y=4,z=3*/x=(y=4)/(z=3)/*x=1,y=4,z=3*/(a=3*5)=4*3 (a=3*5)=4*3 相当于相当于 (a)

49、=4*3 (a)=4*3所以,赋值表达式作为左值时应该加上括号。所以,赋值表达式作为左值时应该加上括号。例例1 1:x=6x=6 x+=x*=x/=3 x+=x*=x/=3 结果结果 x=8x=8例例2 2:a=12a=12 a+=a-=a*a a+=a-=a*a 结果结果 a=-264a=-264例例3 3:b=3b=3 printf(“%d”,a=b)printf(“%d”,a=b)输出应为输出应为3 3 723.10 逗号运算符和逗号表达式一、逗号运算符的特性及作用一、逗号运算符的特性及作用将将若若干干表表达达式式连连接接起起来来,优优先先级级在在所所有有运运算算符符中是最低的。结合方向

50、是中是最低的。结合方向是“从左至右从左至右”的。的。一般格式为:表达式一般格式为:表达式1 1,表达式,表达式2 2 求求解解过过程程是是:先先求求表表达达式式1 1,再再求求表表达达式式2 2。整整个表达式的值是表达式个表达式的值是表达式2 2的值。的值。n如:如:3*33*3,4*44*4 结果应为结果应为1616。731.1.一般扩展的标准形式为:一般扩展的标准形式为:表达式表达式,表达式表达式,表达式表达式n n2.2.求解过程:求解过程:(顺序求值运算)(顺序求值运算)自左至右,依次计算各表达式的值,自左至右,依次计算各表达式的值,“表表达式达式n”n”的值即为整个逗号表达式的值。的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com