类型、运算符与表达式.ppt

上传人:zhu****ei 文档编号:2849693 上传时间:2019-12-02 格式:PPT 页数:85 大小:687KB
返回 下载 相关 举报
类型、运算符与表达式.ppt_第1页
第1页 / 共85页
类型、运算符与表达式.ppt_第2页
第2页 / 共85页
类型、运算符与表达式.ppt_第3页
第3页 / 共85页
点击查看更多>>
资源描述
1,第3章 数据类型、运算符与表达式,3.1 C语言基本元素 3.2 C的基本数据类型 3.3 C的运算符及表达式,2,3.1 C语言基本元素,C语言的基本元素是指能构成程序和其他复杂成份的基本要素, 主要有C的字符集、 标识符、 保留字(关键字)、 常量及变量等。 3.1.1 C的字符集 C语言中可用的字符有以下几类: (1) 大小写的英文字母: A, B, , Z, a, b, , z; (2) 阿拉伯数字: 0 1 2 3 4 5 6 7 8 9 (3) 特殊字符: + - * / % = _ ( ) : ? (4) 不可打印的字符: 空格, 换行符, 制表符。,3,3.1.2 标识符 标识符是某种对象的名字或标记, 这些对象可以是变量名, 函数名, 标号等等。 标识符的构成成份是: 字母、 数字和下划线; 构成规则是: 以字母或下划线开头的字符序列。 对象的取名最好能直观表达该对象的意义, 这样能很自然地引起联想, 便于阅读和理解。比如表示圆周率可取名pi, 表示求和可取名sum等。 在C语言中大小写母表示不同的意义, 这样sum和SUM就是两个不同的名字, 甚至sum和sUm也不相同。 正确的标识符: abc, _ab2, _123, total 不正确的标识符: 123, ab c, ab*c,4,3.1.3 关键字 C语言中有一种特殊的标识符, 它在程序中有特定的含义, 用在特定的地方, 不能随便移作他用。 它们是C语言系统使用的, 用户在定义对象名时不能使用这些标识符。 这样的标识符称为关键字或保留字(32个), 它们都是一些英文单词或缩写。 C语言的关键字如下: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while,5,3.1.4 变量和常量 1. 常量 常量是在程序执行过程中其值不变的量, 如123, 45.2, a, “abc”等, 这样的常量也称为常量直接量, 因为其含义是由其字面意义直接表达的。 还有一种常量称为符号常量, 是用一个名字来代表常量。 定义符号常量的方法是用define命令把一个常量名和常量联系起来。 如 define PI 3.1415926,6,2. 变量 变量是其值在程序执行过程中可以改变的量。 如定义sum是个变量, 则执行语句 sum=0; 后, 它的值为0, 再执行语句 sum=1; 之后, 它的值就变为1。 之所以会有这些变化, 是因为变量实际上是内存中的一段存储单元, 里面可以存放变化的数据。 要想把内存中的某段存储单元和一个变量名联系起来, 必须首先对变量进行定义或声明。,7,变量声明的一般形式是: ; 是C语言中可以使用的数据类型; 则是由一个或多个用逗号分开的标识符即变量名组成, 最后以分号结束。 如: int sum, i ; 就定义了两个变量sum和i, 它们的类型是整型。 这样就在内存中开辟出两个能存放整数的存储单元, 这两个单元在空间上不一定是连续的。 注:若变量只声明而未赋值,默认情况下数值类型变量的初始值为0。,8,当执行语句 sum=0; i=1; 之后, 变量sum和i的存储单元为:,如果再执行语句 sum=i+2; 则存储单元变为:,9,对变量必须先声明后使用的原因在于: (1) 不同类型的数据在编译时分配的内存空间大小不同, 如: 字符型占一个字节, 整型占两个字节, 而浮点型占四个字节。 (2) 不同类型的数据在内存中的存储形式不同, 如:字符型是以ASCII形式存储的, 整型是以补码形式存储的, 浮点型是以指数形式存储的。 (3) 对不同类型的数据所使用的运算符不同, 比如%(求余)运算符只能用于整型变量而不能用于浮点型变量。,10,3.1.5 字符串常量 字符串常量在C程序中有着广泛的使用, 它是用双引号括起来的字符序列。 如: “string” “this is a book” “sum is %d n” 等都是字符串常量。,11,3.1.6 注解 为了便于对程序的功能、 程序中的语句和函数等的理解, 可在适当的地方加注解。 注解的内容放在“/*”和“*/”之间, 编译器对其中的内容作为空白符对待而不予处理。 如: /* this is a user defined function */ 就是对一个自定义函数的注解。 一个注解可以写多行, 只要注意“/*”和“*/”前后配对即可, 如: /* this is a comment */,12,例: 注解的应用。 /* this is a single program */ define TEN 10 include main() int sum; sum=2*TEN+2; /* namely: sum=2*10+2 */ printf(sum=%dn,sum); 程序中用到了注解和符号常量。,13,3.2 C的基本数据类型,计算机可以处理多种多样的数据,这些数据有着内在的联系和差别。物以类聚,计算机中的数据也如此,C语言把具有某些共同特征的数据归为一类,以便处理。 C语言作为现代化的语言有着丰富的数据类型,它既有基本类型,又有构造类型,还有指针类型和空类型。下图是C的数据类型总览。,14,图:C的数据类型总览,15,3.2.1 int(整数)类型 1. int 类型及其扩展 对不同的数据类型,编译系统会分配大小不同的内存单元以存放不同类数据,因此就决定了每一类数据必然有一定的取值范围。整型数据是整数的一个子集。在ANSI C中,基本整型占两个字节,即16位二进制位,最高位为符号位,数值位占15位,这样它的取值范围即为: -215 215 1 即:-32768 32767 基本整型的标识符为int,由它可以定义整型变量: int i , j , k ; 则i , j , k 这三个变量可以取-3276832767之间的任何整数值。,16,(1) short int:短整型,可简写为short。 其位数不比 int 类型长,一般和 int 类型一样长,数值范围也为 -32768 32767,在表示较小的整数时使用。 (2) long int:长整型,可简写为long 其位数不比 int 类型短,其长度规定为 int 类型的两倍,即4个字节,取值范围为-231231-1之间,可表示更大的整数。,17,例: 求int, short int和long int类型的长度。 include main() printf(sizeof( int )=%dn,sizeof( int ); printf(sizeof(short)=%dn,sizeof(short); printf(sizeof(long)=%dn,sizeof(long); 运行输出: sizeof(int)=2 sizeof(short)=2 sizeof(long)=4 因此有如下关系: sizeof(short) sizeof(int) sizeof(long),18,(3) unsigned int:无符号整型,简写为unsigned 其长度和 int 类型相同,但是它取消了符号位,把最高位也作为数值位使用。因为取消了符号,所以它的值全部是正的。 它的取值范围: 0 65535 注:类型修饰符还包括signed 2. 整型数据的溢出 上述各种整数类型都有各自的取值范围,一旦越出了这个范围,就不能正确地表示数据,这种情况称为“溢出”。我们先来看两个例子。,19,例: include main() int max , min; max=32767; min=max+1; printf(max=%d,min=%dn,max, min); ,20,运行输出: max=32767 , min= -32768 为什么max加1以后会产生负值呢? 这是因为整数在内存中是以补码形式存储的,最高位是符号位,符号位为0时表示正数,为1时表示负数,而补码运算中符号位是参与运算的: max: 0111111111111111 + 1 min: 1000000000000000,符号位,21,例: include main() int min , max ; min = -32768; max = min - 1; /* max=min+(-1) */ printf(min=%d , max=%dn,min, max); ,22,运行输出: min=-32768 , max=32767 我们可以做同样的分析,在补码表示的情况下: 1000000000000000 + 1111111111111111 10111111111111111,-1的补码,32767,-32768的补码,溢出,23,3.整型常量的几种表示形式 在C语言中,整型常量有三种表示形式:十进制表示,八进制表示和十六进制表示。其特征表示在数值的前缀上。 (1) 十进制表示: 用十进制数码表示数,不加前缀。如:123,-45,0等。 (2) 八进制表示: 用八进制数码表示数,加前缀“0”(数字零)。如:0123,0275等,而0129则为错误表示形式,因为9不是八进制数码。 (3) 十六进制表示: 用十六进制数码表示数,加前缀0x或0X(数字零和字母x(X)。如0x1A,0X8F等。 除了前缀以外,整型常量还可以带后缀,以明确指明该数属于什么整数类型。后缀可以是l(或L),u(或U)及其组合。l表示长整型,u表示无符号整型,组合形式有:ul,uL,Ul,UL,lu,lU,Lu,LU。,24,例: #include main() int i; unsigned int u; long int l; i=123; u=123; l=123; printf(i=%d,u=%d,l=%dn,i,u,l); i=u+l; u=l+i; printf(i=%d,u=%dn,i,u); 运行输出: i=123,u=123,l=123 i=246,u=369,注:不同类型之间赋值注意溢出错误。,25,3.2.2 char(字符)类型 字符类型以char作为类型标识符。用char定义的变量称为字符变量,一个字符变量只能容纳一个字符。一个字符常量是用单引号括起来的字符,如a,A,*等。在内存中为一个字符变量分配一个字节的存储空间。由于一个字节的8位二进制位可以有2+8=256种不同的组合形式,因而可以有256个不同的字符。在这256个字符中,有些是可见的;有些是不可见的,它们只起控制作用,如换行、回车等。,26,1. 字符在内存中的存放形式 字符在内存中是以编码的形式存放的。最常用的编码方式是ASCII码。存储一个字符,实际上是把它的ASCII码放入内存中。 因为在内存中都是以二进制形式表示的,因此字符型和整型之间有相通性,这些相通性表现在: (1) 字符型数据可以用整型形式输出;反之,一定范围内的整数也可以用字符形式输出; (2) 字符型和整型之间可以进行混合运算; (3) 整型变量可以接收字符常量,字符变量也可以接收整型数值,当然这都要在一定范围之内。,27,例 #include main() int i,j; char c1,c2; c1=a; c2=b; printf(c1=%c,c1=%d;c2=%c,c2=%dn,c1,c1,c2,c2); i=97; j=98; printf(i=%d,i=%c;j=%d,j=%cn, i , i , j , j ); 运行输出: c1=a,c1=97;c2=b,c2=98 i=97,i=a; j=98,j=b 英文大小写字母之间有这样的关系:相应小写字母的ASCII码比大写字母大32。根据这一关系,我们可以将大小写字母任意转换。,28,例 include main() char c1,c2; c1=a;c2=B; printf(c1=%c,c2=%cn,c1,c2); c1=c1-32; c2=c2+32; printf(c1=%c,c2=%cn,c1,c2); 运行输出: c1=a,c2=B c1=A,c2=b,29,例: include main() int i; char c; i=a; c=98; printf(i=%d,c=%dn,i,c); printf(i=%c,c=%cn,i,c) ; 运行输出: i=97,c=98 i=a,c=b 一个字符在内存中占一个字节,对这个字节的最高位,不同的系统有不同的处理方法。,30,例: include main() char c=199; printf(c=%d,c=%cn,c,c); 输出为: c=-57 , c=,31,2. 字符常量 我们已知字符常量是用单引号括起来的字符,这对于可显示字符来说很容易表示,但对控制字符怎样表示呢? 在C语言中没有相应的直接形式显示这些字符,但可以换一种形式来表示它们,即用转义字符来表示。转义字符是以反斜杠开头,后面加其他字符。反斜杠的作用是把后面的字符赋以新的含义(即转义)。以开头定义的字符有三种情况:非显示字符(控制字符);可显示字符;字符的数值表示。如下表所示。,32,表: C 的转义字符及其含义,33,例: include main() printf(“This is a programn“); printf(“this isba012 programn“); printf(“firstsecond“); 运行输出: This is a program his ia program “firstsecond“ 其中,“t”是水平制表符,“b”是退格符,“012”和“n”都是换行符。要想输出“”,必须写成“”;要想输出“”,必须写成“”。,34,3.字符和字符串 前面已指出,字符串是用双引号括起来的字符序列。字符和字符串有着本质的区别: (1) 字符用单引号括起来,而字符串用双引号括起来; (2) 单引号括起来的只有一个字符,而双引号括起来的有多个字符。,35,3.2.3 float和double类型 1. 浮点型数据的两种表示形式 对一个实型常量,可以用两种形式表示它,即十进制小数形式和指数形式。 (1) 十进制小数形式,如123.45,-0.001。 (2) 指数形式,其组成格式为: e(或E) 其含义为: 10 这几部分的书写规则是: (1) 尾数部分不能省略,即e(或E)前必须有数据; (2) 指数部分必须是整数; (3) 尾数可以只有整数部分或只有小数部分; (4) 指数、尾数都可以带符号,如省略符号则隐含为正。,36,2. 浮点型变量的分类 浮点型变量分单精度(float)、双精度(double)和长双精度(long double),它们的长度、精度及取值范围如下表所示。,表:不同类型实型变量的长度、精度和取值范围,37,3.2.4 变量赋初值 前面已介绍了三种数据类型,用类型名可以定义相应的变量。根据先定义后使用的原则,在定义变量之后,可以对它进行处理。如: int i, j; i=3; j=3 ; 通过赋值语句,使i,j具有数值3。我们还可以把二者结合起来,即在定义变量的同时就让它有一个值,这就是变量赋初值,如: int i=3 , j=3; 程序可以对i,j的当前值进行运算,当然这些值在以后是可以改变的。,38,3.3 C的运算符及表达式,C语言不仅数据类型丰富,运算符也十分丰富,几乎所有的操作都可作为运算符处理。由运算符加适当的运算对象可构成表达式,而表达式是C程序的重要要素之一,因此掌握好运算符的使用对编写程序是十分重要的。,39,3.3.1 算术运算符 1. 基本的算术运算符 C语言中基本的算术运算符有:+、-、*,/,%,其含义如下表所示。,在算术运算符的使用中有以下两点需要注意: (1)除法运算符“/”的结果和其运算对象有关。(5/2=2、5.0/2=2.5) (2)求余运算符“%”要求其运算对象都必须是整数,但可正可负。,40,例:include main() printf(5/3=%d,-5/+3=%dn,5/3,-5/+3); printf(3/5=%d,3./5=%fn, 3/5 , 3./5 ); printf(10%3=%d,-10%3=%d,10%-3=%d, -10%-3=%dn,10%3,-10%3,10%-3,-10%3); 运行输出: 5/3=1,-5/+3=-1 3/5=0,3./5=0.600000 10%3=1, -10%3=-1 , 10%-3= 1, -10%-3=-1 注意:要输出一个百分号%,在控制串中必须有两个连续的百分号%。,41,2. 算术运算符的优先级和结合性 C语言中算术运算符的优先级和代数学中的规定是一样的,并且都是从左向右结合的,算术运算符的优先次序如下表所示。,42,3.3.2 自加(+)自减(-)运算符 C语言中有两个特殊的算术运算符,即自加、自减运算符(+和-)。这两个运算符都是单目运算符,它们既可以放在运算对象之前,也可以放在运算对象之后,形成前置形式和后置形式,而运算对象也只能是整型变量。不管前置还是后置,其运算结果都是一样的,都是把运算对象的值增加1或减少1。设有整型变量i: +i , i+ 都使i值增加1 -i , i- 都使i值减少1 例如: int i , j=2; 则下面运算的结果是i等于3,j也等于3。 i=+j; 而下面的运算结果是i等于2而j等于3: i=j+;,43,使用自加、自减运算符应注意以下几点: (1) 最常见的错误是把自加自减运算符用在非简单变量的表达式上,如+(x+2),+(-i)等都是错误的。 (2) 自加自减运算符的结合性是自右向左的。 (3) 如果两个运算对象之间连续出现多个运算符时,C语言采用“最长匹配”原则,即在保证有意义的前提下,从左到右尽可能多地将字符组成一个运算符。 (4) 因字符类型和整型是相通的,故对字符变量也可以进行自加、自减运算。,44,例:include main() int p,x=3; char c=a; p = - x+1; printf(p=%d,x=%dn,p,x); printf(c=%cn,+c); 运行输出: p=-2,x=4 c=b,45,3.3.3 赋值运算符 要使一个变量得到值或改变它的值,除了可以用scanf函数输入外,也可以很方便地用赋值运算符实现。前面我们已介绍过赋值运算符的基本使用,现在做进一步的说明。 1. 一般的赋值运算符 在C语言中,赋值运算符为=,由它可以构成赋值表达式: = 如: int a=5,b=6; a=b+3; b=a-2 ;,46,2. 赋值运算中的类型转换 如果赋值运算符两边的类型不一致,则在赋值的时候要对右边表达式的类型进行转换,使之适应左边变量的要求,或者说用左边变量的类型去剪裁改造右边的表达式。为了便于表达,我们做如下的约定: 类型1 (类型2) 表示把类型2的值赋给类型1的变量。 具体地有以下几种情况: (1)int(float,double) 只取float,double的整数部分,但当float,double的整数超过int所表示的范围时,将出现数据错误。,47,(2) float(int) double(int) 变量中的整数部分是右边表达式的值,而小数部分是相应个数的0。如: float f=15; double d=15; 则有:f=15.000000 (6个0) d=15.00 0 (14个0),48,(3) float(double) 在float类型所能容纳的范围之内,把double数值的前7位放入float型变量中,超过范围则出错。 double(float) 在double变量中,有效位数扩展到16位,数值不变。,49,(4)int(unsigned char) int类型占2个字节,char类型占一个字节,赋值是把字符放入整型变量的低8位,高8位全部补0,以保证是个正整数。例如: int i; unsigned char c=376; i=c;,50,(5)char(int, short int, long int) 此时只把整数的低8位送到字符变量中,其余全部截掉,如整数大于255(低8位的最大值)时,赋值在变量中会改变原来的值,如: int i=256; char c=i; printf(i=%d,c=%dn,i,c); 则输出为: i=256,c=0,51,(6)long(int) 把int类型数值送入long类型的低16位中,高16位按“符号扩展”的原则处理。 int(long) 把long的低16位送入int型变量,高16位截掉,如高16位中仍有数据,则变量中有可能改变原来的值。,52,(7) int(unsigned int) long(unsigned long) short(unsigned short) 这类赋值的特点是两边的长度相等,但取值范围不同,右边的正数范围要比左边大一倍,因此只有在左边的正数范围内赋值才正确,否则所赋的正值在变量中会得到负的结果。,53,(8)unsigned int(int) unsigned long(long) unsigned short(short) 这是和(7)相反的赋值,可以照原值全部传送,但若传送负数,则接收者会得到一个正数的结果,其原因在于把原来的符号位此时也当成了数值位。例如: unsigned int a; int b=-1; a=b; printf(b=%d,a=%dn,b,a) ; 则输出为: b=-1 , a=65535,54,回 顾,55,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; 实型常量只能用十进制形式表示 2.1E10.2、E-6、6.4E+4.8、E9 ; “changsha“ 、“+?ab“ ; 、p 、ab ;,直接常量:是在程序中直接引用的数据。,请判断这些常量正确与否:,56,变量初始化 在定义变量的同时给变量一个初始值。,int a=5, b=3; int a=b=c=3; int a,b,c; a=b=c=3; ,运算符:就是表示某种运算功能的符号。 按操作功能运算符大致可分为:算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符、逗号运算符以及按位运算符等。,表达式:是由操作数和运算符组成的序列。 如:1+2*3-4 、 35-7 、a=b%2 等都是C语言中的表达式。,57,%(取余)(注意:取余运算的操作数只能是整数,且结果的符号与前一操作数的符号相同),算术运算符和算术表达式,1、 运算符 +(加):3+4、 +3 -(减):3-5、 -5 *(乘):3*5 /(除):5/2、5.0/2 (注意,此二种形式,结果不同),5%3的值为2; -5%3的值为-2; 5%(-3)的值为2; -5%(-3)的值为-2; 12.3%3 若a%b 的结果为0,则有a能被b整除,58,等价于:j=i;i+; 所以i的值为4,j的值为3,等价于:i+;j=i; 所以i的值为4,j的值为4,(1) i=3; j=i+; (2) i=3; j=+i;,自增与自减运算符 (+ 、-), +i,-i:使用之前使i的值增1(或减1);, i+,i-:使用之后使i的值增1(或减1);,分析下面几种情况中i与j的值:,当+、 -不与其他运算符混合使用时,+i与i+都等价于 i=i+1, -i与i-都等价于 i=i-1,59,如:i = 2; j = -i+; 求执行完这两句后i与j的值分别是多少,特殊的:设i=3,j=4,k=i+j, k= i= j=, 结合性:自右至左。,分析:“+”与”-“是同优先级,且都高于“=” 按结合规则,等价于:j=-(i+); 结果:i的值为3,j的值为-2。,再看几个例子: 如:设i=3,k=(i+)+(i+)+(i+) k= i=,9,6,如:设a=3,b=(a+)+(a+) b= a=,6,5,设a=3,b=(+a)+(a+) b= a=,8,5,设a=3,b=(a+)+(+a) b= a=,8,5,设a=3,b=(+a)+(+a) b= a=,10,5,7,4,4,60,1、6种关系运算符:= = != 2、关系表达式:用关系运算符将表达式连接起来的式子 优先级: (= )( = != ) 结合性:自左至右; 表达式的值: 若为真,则结果为1; 若为假,则结果为0。,35 值为: 32 值为: 设x=-2; -3x-1 值为: 设x=1; 2x4 值为:,例如,关系运算符和关系表达式(第五章 5.1),求如下关系表达式的值:,0,0,0,1,算术运算符优先级高于关系运算符 3+(43)*4 值为: 3+43*4 值为,3,1,注意,不能用数学里习惯的关系运算符连用表示区间关系!,61,2、逻辑表达式:用逻辑运算符将表达式连接起来的式子 优先级: ! & | 结合性:自左至右; 表达式的值: 若为真,则结果为1; 若为假,则结果为0。,逻辑运算符和逻辑表达式(第五章 5.2),1、3种逻辑运算符: & | !,参与逻辑运算的操作数叫逻辑量。,逻辑量可以是整型、实型、字符型和指针类型, 其中,0,0.0,0,NULL代表假,其余逻辑量代表真。,62,int a=5; float b=3.5; !a ( ) !(a 0) ( ) (a 0) ( ),例如,0,1,1,0,0,0,1,1,0,0,0,1,63,例如表达式运算如下:,混合优先级: ! 高 算术运算符 关系运算符 &和| 赋值运算符 低,4 - 0,1 & 2,8 4,1,0,1,5 3 & 2 | 8 4 - !5,64,例如: (1)a = 0; b = 1; c = a+ 执行后: a为 ,b为 ,c为 。,逻辑或优化和逻辑与优化:,在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。,1,1,0,(2)a = 1; b = 1; c=0; d = -a | b- | (c = b+3 ); 执行后: a为 ,b为 ,c为 ,d为 。,0,0,0,1,65,例如: (1) n是小于m的偶数: (2)year是闰年(能被4整除但不能被100整除,或能被400整除),逻辑表达式一般用于控制语句中的条件:,n m & n % 2 = 0,year % 4 = 0 & year % 100 != 0 | year % 400 = 0,66,例如:(1) x=(y=12)/4 (2) x=y=12/4 (3) x=(y=12/4) (4)(x=y)=12/4,赋值运算符和赋值表达式,1、赋值运算符 = (执行功能:把=右边的表达式的值,存入=左边的变量对应的存储空间,即给此变量赋值) 3=2+1 a=a+2,2、赋值表达式:用赋值运算符将变量和表达式连接起来的式子 形式: = 求值规则: 将“=”右边表达式的值赋给左边的变量。 优先级: !算术关系& |赋值 结合性:自右至左; 表达式的值:被赋值变量的值。,y值为12,x值为3,表达式的值为3,y值为3,x值为3,表达式的值为3,y值为3,x值为3,表达式的值为3,67,复合的赋值运算符 在普通赋值运算符的前面加上其他成份可构成复合的赋值运算符。其一般形式为: = 其中可以是如下运算符之一: + - * / % & | 复合赋值运算的语义是: = (),68,练习:设a=12,计算表达式a+=a-=a*12和a+=a-=a*=12的值,复合赋值运算符: *=、/=、 %=、 +=、 -=, =, &=、 =、 |= 复合运算符是一个运算符,但功能上,是两个运算符功能的组合。,例如: a+=b 相当于 a=a+b a*=b 相当于 a=a*b,注意:a*=b+c 相当于 a=a*(b+c) 而不是 a=a*b+c, 优先级: 与 = 是同一优先级。 结合性:自右至左; 表达式的值:被赋值变量的值。,-264,0,69, 求值规则: 先求解表达式1的值 若为真(非0),求解表达式2,并把表达式2的值 作为整个条件表达式的值 若为假(0),求解表达式3,并把表达式3的值作 为整个条件表达式的值,其它运算符,1、条件运算符 (第五章 5.3.3 P102) ?和: ,它们与三个操作数组组成三元运算。 形式为: ? :, 优先级: 逻辑条件赋值, 结合性:自右至左;,70,又如: y = x10 ? x/10 : x0 ? x: -x 当x的值为整型的15时,表达式的结果为: 当x的值为整型的5时,表达式的结果为:,1,5,例如: int max,a=5,b=3; max=ab?a:b 求max的值,max的值为5,71,逗号运算符 逗号在C语言中主要起两个作用,一是作为分隔符,一是作为运算符。 1. 逗号分隔符 在变量的定义和函数的参数中都用到了逗号分隔符。如: int i , j ,k ; char c1, c2, c3; result=max(a, b); 这里它的作用是把同类型的变量名分开,把函数的各个参数分开。,72,2. 逗号运算符 作为运算符,它是把两个对象“连接起来”,使之成为一个逗号表达式。 其一般形式是: , 求值规则: 从左至右依次计算各表达式的值; 优先级: 最低; 结合性:自左至右; 表达式的值:最后一个表达式的值。 例如: i=1 , j=0 , sum=0 , m=2*i+3 是一个由四个赋值表达式构成的逗号表达式,此表达的值是m的值。,73,例如: a b y 表达式 y=a=4,b=5,a+b; y=(a=4,b=5,a+b); y=(a=4,b=5),a+b; y=a=(4,b=5),a+b;,4,5,4,9,4,5,9,9,4,5,9,5,5,5,5,10,74, 形式有两种: sizeof () 或 sizeof 结果为整型数。,int a; float x; printf(“%d,%d”,sizeof a,sizeof x); printf(“%d,%d”,sizeof(int),sizeof(float); 以上两个printf语句结果均为 。,例如,3、求字节运算符: sizeof sizeof 是一个单目运算符, 作用:求得变量或某种数据类型所需的字节数。,2,4,其中运算对象可以是数据类型名、变量名、常数名等。变量、常量的大小实际上是它所属类型的大小。 虽然sizeof的使用像是一个函数调用,但它只是个运算符,不是函数,它没有函数调用方面的开销,75, C语言允许整型、实型、字符型数据进行混合运算。 有3种转换方式:自动转换、赋值转换和强制转换。 一、类型自动转换,数据类型转换,特点:由数值存储位数少的向多的转换;整型向实型转换! 操作数为相同类型的不转换,仍取原类型。,76,int x=2;float y=1.6;char c=A; 则: c + 1/x * y = =,例如,65(int)+ 0(int) * 1.6(float),65(double),77,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),思考 int a=1,b=2; 表达式a/b+3的结果是多少?,78,char c=68.5; printf(“%c”,c);,二、 赋值转换(复习) 在赋值时将赋值符右边值的类型转换成与其左边变量类型一致的类型。,有下列几种情况: (1) 实型 整型(字符型):去掉小数部分;,(2) 整型(字符型) 实型: 补足有效位;,float f=23; 23.00000 f (7位) double f=A; 65.0000000000000 f(15位),79,(3)对char、int、short、long、unsigned型数据: 赋值符右边数据(a位) 赋值符左边的变量(b位) 若 a=b ab,ab,原样照赋;,截断高a-b位,送低b 位;,有符号数据 有符号变量:符号扩展;,其他情况:高b-a位全补0。,符号扩展: 符号位为0,剩余的高位补0; 符号位为1,剩余的高位补1。,80,例如: int a=2,b=5; float x=4.4; 则有: 表达式 结果 b/a (float)b/a (float)(b/a) (int)x%a+x (int)x%(a+x),3、强制类型转换 在自动转换达不到程序员的要求时,程序员要亲自出面对数据作强制转换。强制转换的办法是在被转换的数据前加上所需的类型名。 形式: (类型名)表达式 强制类型转换时,得到所需类型的中间变量,原来变量的类型不会改变。,2,2.5,2.0,4.4,81,强制类型转换的使用主要有以下几个方面: (1) 运算对象要适应运算符的要求,如%要求其运算对象都应是整数; (2) 为得到符合数学意义的运算结果而对运算对象进行强制转换。 float f; f=17/4*5; printf(f=%fn,f) ; 则计算结果为:f =20.000000,与数学意义不符,如采用强制类型转换后: f = (float)17/4*5; 则结果为:f = 21.250000,82,(3) 函数调用时参数类型的要求。如求x+y的数学函数pow(x,y),要求x,y的类型都必须是double类型,如果实在参数不是double类型则应做强制转换: r=pow(double)m , (double)n) (4) 在创建动态数据时,要对新开辟单元的指针作强制转换。,83,例: include main() float x=4.7; int i; i=(int)x%3; printf(i=%d,x=%fn,i,x); ,运行输出: i=1,x=4.700000 x的原值并未改变。,84,3.3.6 运算符优先级及求值次序,85,作业,习题:3.6 3.12,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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