计算机C语言-第三章.ppt

上传人:小飞机 文档编号:6023351 上传时间:2023-09-15 格式:PPT 页数:89 大小:311.50KB
返回 下载 相关 举报
计算机C语言-第三章.ppt_第1页
第1页 / 共89页
计算机C语言-第三章.ppt_第2页
第2页 / 共89页
计算机C语言-第三章.ppt_第3页
第3页 / 共89页
计算机C语言-第三章.ppt_第4页
第4页 / 共89页
计算机C语言-第三章.ppt_第5页
第5页 / 共89页
点击查看更多>>
资源描述

《计算机C语言-第三章.ppt》由会员分享,可在线阅读,更多相关《计算机C语言-第三章.ppt(89页珍藏版)》请在三一办公上搜索。

1、第四讲,C的数据类型、运算符、表达式,本章导读,程序=算法+数据结构;前者已知,从这一节开始,解决后者确定了数据类型,则就明白了它们在计算机的有效形式,取值范围,运算规则等接下去再去研究这些规则这是我们的最终目标,数据与数据类型,程序设计语言的基本规则包括,常数 变量 运算符 表达式 函数,什么是语言规则?为什么要有这些规则?,?,?,把自然语言描述问题的方式转换为C语言的形式表达给计算机,规则,常数,变量,函数,数据与数据类型(续),问题,常数3、5和3.6的存放空间是否相同?变量a如何表示?如何存放?计算机如何知道3.6和a之间的关系?和 如何输入?如何存放?计算机如何识别“=”?运算结果

2、放在哪里?,数据的描述数据的操作,规则,类型,运算符,计算机完成上述计算,首先要解决数据的输入和存放问题,编程应考虑的问题:1.数据的描述:定义数据类型。即加工处理的数据采取什么类型。2.动作的描述:通过语句实现。告诉计算机操作的步骤,3.1 C的数据类型,C数据类型数据类型总表,数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作(运算规则)4.程序中所用的所有数据必须指定其类型,枚举类型enum,常量与变量常量和符号常量常量:在程序执行过程中,数值始终保持不变的量。整型:5,-26,0,012,0 xF 实型:3.14,-2.45,2.17 e1 字符:a,1,A,$标识

3、符(符号)例如:#define pi 3.14 常量一般从其字面形式即可判别,因此不需要定义(直接常量),标识符(*),概念:就是用来标识变量名、符号常量名、函数名、类型名、文件名等的有效字符序列。简而言之:标识符就是我们自己起的一个名字,(1)标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。,定义规则:,如:_1 year month student_name sum0 M.D.Jones$123#a 3b?c a=b,(2)在C语言中,大小写字母不等效。因此,a和A,I和i,Sum和sum,分别是两个不同的标识符。一般的,变量名、函数名用小写,常量符号用大写。,

4、(3)标识符的长度?Student_name/student_number,TC允许32个,建议不超过8个增加可移植性(4)用户自定义的标识符不能与保留字(关键字)同名。,保留字,关键字,概念:就是具有特定含义的标识符,用户不能用来作自定义标识符。,C语言中的关键字较少,由ANSI标准推荐的关键字有32个。,(1)与数据类型有关的(14):char int float double signed unsigned short long void struct union typedef enum sizeof,(3)与程序控制结构有关的(12):do while for if else swi

5、tch case default goto continue break return,(2)与存储类别有关的:auto extern register static,例T3-1.c#define PRICE 30(预处理命令,比如#include)main()int num,total;num=10;total=num*PRICE;printf(“total=%d”,total);输出:total=300 问题:允许语句PRICE=20吗?,为什么要用符号常量,符号常量:见名知意,程序中一改全改,输入方便标识符命名的良好习惯见名知意:所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应

6、选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)、sum。,变量,在程序运行过程中,其值可以改变的数据称为变量,有关变量的规定,变量通过变量名标识,变量名和内存中的存储单元相对应。编写程序时通过变量名来存、取存储单元。变量必须先定义(声明)后使用Why?,变量名及变量值,256,12,为何要先声明后使用?1、编译时便于检查:studentstatent2、编译时便于告诉计算机分配相应的存储空间(空房间)3.编译时能进行有关运算的合法性检查,如a%b,两边必须是整型数据。(

7、%是求余运算符),1.变量名由字母 A、B、Z、a、b、z,数字 0、1、9 和下划线 _ 组成。2.变量名的第一个字符必须是英文字母或下横线。3.不能用系统中的关键字作为变量名4.变量名中的字母是区分大小写的。sum、stu_name、_age、Lts_1_2、a232c、x.y、start+9、c2.0 NAME name 表示两个不同的标识符。,变量名的规定,下面来看基本数据类型,重点和难点:整型数据表示数的范围 实型数据的有效数字(精度)字符和字符串的区别 转义字符的概念,3.3 整型数据整型常量表示方法1、十进制整数:如 29,-36,02、八进制整数:以0开头,后跟07中的若干数字

8、;如:0123(83)103、十六进整制:以0 x开头,后跟09,A,B,C,D,E,F(可小写)中的 若干字符,如0 xA2(162)10,整型,整型数据包括整型常量和整型变量,整型数据以二进制补码形式存储,整型变量1、整型变量在内存中的存放形式数据在内存中是以二进制补码形式存放的。2字节,符号位。例:int i,j;(空房间)i=10;j=-10;,整型变量的定义,例如:int i,j;long k,m;unsigned int x,y,变量有值吗?,C中的所有变量必须先定义后使用!,格式:类型说明符 变量列表;,!,2、整型变量的分类 根据数值的范围可定义以下类型的变量:1、基本型:用i

9、nt 定义2、短整型:用short int 或 short 定义3、长整型:用long int 或 long 定义 整:unsigned int4、无符号型:短整:unsigned short 长整:unsigned long注:有符号型是signed,为系统默认值,因此一般缺省。0正;1负,无符号数据的特点:最高位不是作为符号位,而是作为存放有效数值本身。(只能存放正数,为什么要定义无符号型的)例:int a;/*a的数值范围为-32768 32767*/unsigned int b;/*b的数值范围为0 65535*/无符号型整数变量中绝对不能存放有符号整数,ANSI 定义的整数类型(取决

10、于字长)类型 比特数 取值范围int 16-3276832767short 16-3276832767long 32-21474836482147483647unsigned int 16 065535unsigned short 16 065535unsigned long 32 04294967297,以十进制数13为例,说明该数在内存中的存储情况 其中:带符号数在内存中存储形式是:最左边一位(最高位)是符号位,正为0负为1不带符号的数在内存中的存储形式是:最左边一位(最高位)是数值的有效位特别提示:不要随便使用long型,intsortlong,unsigned intunsigned

11、sortunsigned long,3、整型变量的定义变量类型定义的目的:让编译为其分配内存单元。变量的定义一般在函数开始的声明部分,也可以在分程序 中,若在分程序中定义,其作用域仅在分程序中有效。例T3-2.cmain()int a,b,c,d;unsigned int u;a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=%d,b+u=%dn”,c,d);运算结果:?由此可见:不同类型的整型数据可以进行混合运算问题1:u=-12可以吗?2:a=123456可以吗?,4、整型数据的溢出int 型变量允许的最大值为32767,如果大于此数,将产生溢出例T3-3.c

12、 整型数据的溢出情况main()int a,b;a=32767;b=a+1;printf(“%d,%d”,a,b);运行结果:?首先思考:为何上述存放形式表示-32768而非-32767?溢出计算小窍门:-|65535-31767|变量a是正整数的最大值,加1后赋给b,使数值有效位占据符号位。此种情况,编译系统不会报错,这要靠编程者把握。怎么办?,、整型常量的类型 整型常量根据值大小默认类型,将整型常量赋给整型变量时,要考虑常量的大小和变量所能表示的数据范围。一个整数,其值在如下范围:(1)-3276832767 int,short int,long int(2)-21474836482147

13、483647 long int(3)对于非负数,如:065535 unsigned int,unsigned short 04294967295 unsigned long说明:1.常量中无 unsigned 类型的数,常量均为有符型!正整数可赋给unsigned 变量,只要数值不超过范围。2.在整型常量后加 l 或 L 表示长整型常量,如:456L。用作33.在函数调用时,若被调用函数的形参是长整型变量,则要求主调函数的实参也是长整型数据。,再次强调,整数,关心的是什么?,3.4 实型数据3.4.1 实型常量的表示方法实数又称浮点数(回忆,定点数和浮点数以及在计算机中的存储方式)1.十进制形

14、式的实数:由数字和小数点组成。如:3.14,0.26,0.0,-326.45C规定:必须要有小数点如.123,123.,123.0,0.0均合法2.指数形式的实数:由尾数部分、字母e 或E、指数部分组成。如:48.62e+12,其中:48.62为尾数,+12为指数 e为基数10,它表示48.6210 12 C规定:e的前面要有数字,e后面的指数要为整数。计算机中输出时:均以规范化的指数形式存储。即小数点的左边有且仅有一个非零数字,如:演示,1e3、1.8e-3、-123e-6、-0.1e-3e5、1e-3.2、e、.e-03,实型变量1、实型数据在内存中的存放形式 float 型变量:32位(

15、4字节)double型变量:64位(8字节),计算机中存储时:均以指数形式存储,且小数部分为最高位为非零的纯小数,如,实型变量的分类 单精度(float)、双精度(double)、长双精度(long double)。,单精度实型数据(float)表数范围:十进制形式:7位有效位 指数形式:.e 双精度实型数据(double)表数范围:十进制形式:16位有效位 指数形式:.e 长双精度实型数据(long double)表示数据范围:十进制形式:19位有效位 指数形式:.e,强调,实数关心什么?,3、实型数据的舍入误差-问题 1.0/3*3=1?存储单元所限,有效位以外的数字将被舍去,可能有一些误

16、差。例T3-4.cmain()float a,b;long double c;a=123456.789e5;b=a+20;c=123456789.123456789e4923;printf(“a=%fn b=%fn c=%Lfn”,a,b,c);输出结果:a的值比20大的多,a+20的理论值是而有效位只有7位,因此,后面的数字是无意义的。,3.4.3 实型常量的类型1、未加说明,系统将实型常量作为双精度处理例:float f;f=2.45678*4532.65系统将两数按双精度运算,然后将乘积前7位赋给实型变量f,缺点:浪费系统资源,降低运算速度;解决的办法:在数的后面加f,如2.45678f

17、,系统将其按单精度数运算。小问题:可以123f吗?,2、实型常量可赋给float或double类型变量(只要不超过其取值范围即可),根据变量的类型截取其有效位。例T3-4-1.cmain()float f1;double f2;f1=111111.111;f2=111111.11111;printf(“f1=%fnf2=%lfn”,f1,f2);输出结果:f1=111111.109375 f2=111111.1111100000,3.5 字符型数据字符常量字符常量:用一对单引号括起的一个字符,如a,A,#,9说明:1.字符常量的值是该字符在ASCII码中的码值(P374)。2.a 和A 是两个

18、不同的字符常量,a 97,A 65 3.开头的字符序列称为特殊形式的字符常量(转义字符),特别提示,1、,2、为什么要用8和16进制的表示方法?3、0 000ASCII为0表示空操作,用于字符串结尾。4、考点 128?,例 T3-5.cmain()printf(“-n”);printf(“_ab_ct_derftgn”);printf(“htibbj_kn”);运行结果:-f gde h j_k提示:1、所以/t,是在输出“空格空格空格”2、光标移至1,9,17即使当前光标在第3列,也是移至9。而非3+8=11列,3.5.2 字符变量字符变量:用于存放一个字符常量。字符变量的定义形式:char

19、(character)字符变量名如:char c1,c2;/*定义c1,c2字符型变量,占一个字节*/c1=a;c2=b;/*将字符常量 a,b 赋给c1和c2*/2.5.3 字符数据在内存中的存储形式及使用方法字符常量字符变量中,是其ASCII码值,存储形式与整型数相似,整、字符型数据之间可通用。,例T3-6.cmain()char c1,c2;c1=97;c2=98;(等效于?)printf(“c1=%c,c2=%c n”,c1,c2);printf(“c1=%d,c2=%d n”,c1,c2);运行结果:c1=a,c2=b c1=97,c2=98 特别注意:0-255,因为只占1字节,例

20、T3-7.c大小写字母的转换main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(c1=%c,c2=%cn”,c1,c2);运行结果:c1=A,c2=B提示:小写比大写ASCII码大32,例T3-7-1.c 字符数据与整型数据之间可以相互赋值main()int i;char c;c=97;i=a;printf(“%c,%dn”,c,c);printf(“%c,%dn”,i,i);运行结果:a,97 a,97字符数据占一个字节,TC将字符作为有符号数处理!当ASCII 码值在128255之间时,其最高位为1,占据了符号位,以数据输出时为负数(-1

21、26130),以字符输出时是对应的字符,以无符号数据输出时,也是其对应的数据(p374)。技巧:130-126,例:T3-7-2.cmain()char c1=376;unsigned char c2=376;printf(“%d,%c n”,c1,c1);printf(“%d,%c n”,c2,c2);运行结果:-2,254,请见P374,Char c1Unsigned c2,3.5.4 字符串常量字符串常量:用一对双引号括起的字符序列。如:“BEIJING”,“CHINA”,“$123”,“a”字符串使用的有关说明:字符串可出现在输出函数中;如:printf(“This is a C pr

22、ogram.n”);2.若字符串为“CHINA”,它在内存中的实际存储形式是:字符串在内存中存放时,系统自动加字符串结束符 0,该字符在ASCII码中的码值为0,是空操作符,即无动作,不显示。其长度是6,最后一个字符是0,是系统自动加上的,不能人为加上此字符,它不显示,打印输出时也无任何动作。,3.C中无字符串变量,字符串可以赋给字符数组;4.字符常量与字符串常量意义不同;如:char c1,c2;c1=a;可以 c2=“a”;错误不能把字符串赋给字符型变量。(放不下),3.6 变量赋初值方法有:定义的同时给变量赋初值 如:int a=3;float b=3.1415;char c=x;2.定

23、义变量时,可以对其中的一部分变量赋初值 如:int a=3,b,c,d=8;3.把同一个常量赋给多个变量时,最好分别进行。如:int a=b=c=3;而应写为:int a=3,b=3,c=3;4.初始化是在程序运行时,执行到本函数时赋以初值的。如:int a=3;相当于:int a;a=3;,3.7各类数值型数据间的混合运算在C语言中,整、实、字符型数据间可以混合运算10+a+1.5-8765.1234*b一、不同类型的数据运算时,要转换成同一类型 类型转换原则:低类型向高类型靠拢。横箭头为必转,纵箭头为有条件转换。转换以后进行运算,不同类型之间转换如下图所示:,二、类型转换进一步说明 1.当

24、两数为float 时,都要转换为double型 2.一个为float型,一个为char 型时,要转换为double型。3.一个为long型,一个为 int 型时,则将转换为long型例:T3-7-3.cmain()float a;double b;a=10+a+1.5-8765.1234*b;b=10+a+1.5-8765.1234*b;printf(“a=%f,b=%f n”,a,b);运行结果:a=-858873.562500,b=-858873.593200,数据与数据类型,程序的任务是对数据进行处理,数据是程序处理的对象,而运算符是施加给这些数据的操作。数据和运算符是表达式的基本元素,

25、3.8算术运算符和算术表达式3.8.1 C运算符简介(p375)除控制语句(if,while,for)和输入/输出函数;大部分操作都作为运算符处理。1.算术运算符:+、-、*、/、%2.关系运算符:、=、|、&5.赋值运算符:=6.条件运算符:?:7.逗号运算符:,8.指针运算符:*、&9.求字节数运算符:size of10.强制类型转换运算符:(类型)11.分量运算符:、12.下标运算符:、13.其它运算符:如函数调用,算术运算符和算术表达式1、基本的算术运算符+:加法或正值运算符,如:2+3、+d-:减法或负值运算符,如:8-3、-c*:乘法运算符,如:3*5/:除法运算符,两侧可以是整或

26、实型数据。%:求余运算符 两侧必是整型数据。说明:1、两个整数相除结果为整数(取整),如5/3=1。若为负数,则向零取整,如-5/3=-12、实数进行+-*/,结果为double,因为都必转成double,例T3-7-4.c 整型数据除法运算main()int a,b,c;a=5;b=3;c=a/b;printf(“c=%dn”,c);运算结果:c=1,例 T3-7-6.c实型数据除法运算main()float a,b,c;a=5;b=3;c=a/b;printf(“%fn”,c);运算结果:1.666667说明:(1)两个整数相除结果为整数(取整),如5/3=1。整数除法中一个数为负时,结果

27、取整后向0靠拢,如:-5/3=-1 5/(-3)=-1 8/(-3)=-2-8/3=-2(2)取余运算符两则必须是整型数据,余数与被除数同号 如:-29%4=-7 余-1 29%(-4)=-7 余1-52%7=-7 余-3 52%(-7)=-7 余 3,例T3-7-5.c 长整型数据运算main()int a,b;long c;a=30000;b=30000;c=a+b;printf(“c=%ldn”,c);运算结果:c=-5536C=60000?另外:4/3=1,4/3.0=1.333333,0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0,a,0 1 1 1 0 1 0 1

28、0 0 1 1 0 0 0 0,b,1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0,结果,符号位,2、算术表达式和运算符的优先级与结合性算术表达式:用算术运算符及括号将运算对象(常量、变量、函数)连接起来的,符合C语言语法规则的式子。如:a*b/c-1.5+a在C语言中,运算符共有15个优先级,其中算术运算符的优先级是:*、/、%(3级)+、-(4级)请见P375376算术运算符的结合方向:从左向右,即左结合性如:a-b+c:算符优先级相同,结合性:从左向右 a-b*c:算符*的优先级高于-若运算符两侧的运算对象类型不同时,低类型向高类型转换,3、强制类型转换运算符一般形式:(

29、类型名)(表达式)如:(double)a 将a转换为double型(int)(x+y)将x+y的值转换为整型(float)(5%3)将5%3的值转换成单精度实型说明:1.(int)(x+y)与(int)x+y 意义不同 2.类型转换得一个中间值,原变量的类型没有发生变化。例T3-8.cmain()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%dn”,x,i);运算结果:x=3.600000,i=3,例T3-8-1.cmain()float a,b,c,d;int e,f;a=5;b=3;c=a/b;d=(float)(5%3);e=(int)(a/3

30、);f=(int)(b+3.8);printf(“c=%f,d=%f,e=%d,f=%dn”,c,d,e,f);运算结果:c=1.666667,d=2.000000,e=1,f=6思考:程序运行期间,a,b的值发生变化没有?为什么要强制转换:函数调用形参要与实参类型一致、float x;x%3?(int)x%3,4、自增、自减运算符+:增1运算符,使变量值增1。-:减1运算符,使变量值减1。如:+i,-i:在使用变量i之前,先使变量i加(减)1。i+,i-:在使用变量i之后,使变量i值加(减)1。例T-.cmain()int i,j;i=3;printf(“%d”,i+);(先不看)j=+i;

31、printf(“i=%d,j=%dn”,i,j);运算结果:i=4,j=4,例T3-8-3.cmain()int i,j;i=3;j=i+;printf(“i=%d,j=%dn”,i,j);运算结果:i=4,j=3说明:1.+,-运算符只能用于变量,而不能用于常量和表达式。如a+,b-,5+,(x+y)-。2.+,-运算符的结合方向是从右向左。,例T3-8-4.cmain()int i;i=3;printf(“i1=%dn”,-i+);printf(“i2=%dn”,i);运算结果:i1=-3(why?查看优先级,负号运算符和+同处2级,所以自右向左,因此,相当于-(i+),那怎么不是-4?因

32、为,i+是个表达式,有变量i,运算符+,所以是个表达式,该表达式的值一定等于3,所以,请搞清楚,表达式+i的值为4,表达式i+的值为3!只有做完了所有的工作,即本例中的在表达式(i+)前加个负号运算符及printf后,在使i+1,并覆盖i)i2=4例T3-8-5.cmain()int i;i=3;printf(“i1=%dn”,-+i);printf(“i2=%dn”,i);运算结果:i1=-4 i2=4,5、有关表达式使用中的问题说明(1)要注重C中的运算符和表达式的求值顺序:设变量:int i=3;如表达式:(i+)+(i+)+(i+)此类表达式,系统的不同,求值顺序也有差异。如某系统的求

33、值顺序是先求第一个,再求第二个最后求第三个子表达式,其结果是:3+4+5=12,最后i的值为6而在Turbo C中却有所不同:3+3+3=9,最后i的值为6所以建议:i=3;a=i+;b=i+;c=i+;d=a+b+c;,例T3-8-6.cmain()int i=3,j=3,k,q;k=(i+)+(i+)+(i+);q=(+j)+(+j)+(+j);printf(“i=%d,j=%d,k=%d,q=%dn”,i,j,k,q);运算结果:i=6,j=6,k=9,q=18,若表达式中有多个先增1(减1)或后增1(减1),解决的方法:将同类的子表达式进行扫描归类,先算中间结果,再算最后结果。例T3-

34、8-7.cmain()int i,j,x,y;i=3;j=30;x=(i+)+(+i)+(i+)+(+i);y=(j-)+(-j)+(j-)+(-j);printf(“i=%d,j=%d,x=%d,y=%dn”,i,j,x,y);运算结果:i=7,j=26,x=20,y=112,(2)在C语言中运算符的确定 在由多个字符组成的表达式中,应尽可能多地从左向右将若干个字符组成一个运算符。如:i+j 其结合性是:(i+)+j 而不是:i+(+j)。,回顾一下,(1)int a,b,c;a=5;b=4;c=+a*b;若c=(a+)*b;呢?到底i+什么时候+?,继续,(3)printf 函数输出实参的

35、顺序如:int i=3;printf(“%d,%dn”,i,i+);有的系统按从左到右的顺序求值,输出结果是:3,3 而Turbo C 是按从右到左顺序求值,输出结果是:4,3j=i+;printf(“%d,%d”,j,i)3,4结论:不写别人甚至自己都看不懂的程序,也不写那些不知道系统会怎样运行的程序,请谨慎使用+,-!i+是以一个完整的表达式算完了为+1操作标志的。i-同理,3.9 赋值运算符和赋值表达式1、赋值运算符“=”是赋值号,也是赋值运算符 功能:计算表达式,赋给左边的变量。赋值运算符有计算 的功能。如:a=3+5;b=x*y;a,b不管原来什么值,执行赋值语句后,新值将 取代旧值

36、,2、类型转换 变量类型不同时接收的数据有差异。当赋值运算符两侧的数据类型不一致时,在赋值时要进行类型转换。(1)实型数据赋给整型变量时,舍去小数部分。如:int i;i=3.56;结果i的值为3(2)整型数据赋给实型变量时,数值不值,但以浮点形式存放于内存。如:float a=23;先将23转换成23.00000,然后送a中。double b=23;先将23转换为23.00000000000000,然后送b中。,(3)double型数据赋给float变量 截取前7位,应注意数值范围不能溢出如:double d=123.45678e65;float f;f=d;由于数据溢出,f 将得到错误的值

37、float 数据赋给double变量时,数值不变,有效位扩展到16位。,(4)字符型数据赋给整型变量 字符数据占一个字节,整型数据占两个字节,字符数据赋给整型变量有两种情况:无符号字符型数据赋给整型变量:将其存放在整型变量的低8位中,而高位以0补齐,T3-8-8.cmain()int i;unsigned char c;c=376;i=c;printf(“i=%d,c=%dn”,i,c);结果:i=254 c=254,带符号的字符型数据赋给整型变量 若最高位为0(正数)则整型变量高8位补0。若最高位为1(负数),则整型变量的高8位补1-符号扩展,以保持数值不变例T3-8-9.cmain()in

38、t i;char c;c=376;i=c;printf(“i=%d,c=%dn”,i,c);运行结果:i=-2,c=-2,(5)int,short,long型数据赋给char变量,将它们的低位赋给char型变量(截断)例T3-8-10.cmain()int i=289;char c;c=i;printf(“i=%d,c=%d,c=%cd”,i,c,c);运算结果:i=289,c=33,c=!,(6)将带符号的int赋给long时,int的 16 赋给long的低16位.正数补0,负数进行符号扩展。看例P53long型数据赋给int型变量,将long型数据的低16位赋给int型变量(截断)例T3

39、-8-11.cmain()int a;long b=65544;a=b;printf(“a=%d,b=%ldn”,a,b);运算结果:a=8,b=65544,a=8,符号位,b=65544,(7).unsigned int 型数据赋给 long 型变量时 unsigned int 型数据赋给 long 型变量:将其赋给long型变量的低16位,高16位补0 例T3-8-12main()unsigned int a=65535;long b;b=a;printf(“a=%u,b=%ldn”,a,b);,输出:a=65535,b=65535,若无符号数据赋给相同长度的带符号的变量时,则原样赋给。u

40、nsigned int int unsigned short short int unsigned long long int 要注意数据的有效位占据符号位(即注意取值范围)例T3-8-13.cmain()unsigned int a=65535;int b;b=a;printf(“a=%u,b=%dn”,a,b);运算结果:a=65535,b=-1,(8)带符号的数据赋给长度相同的无符号变量 原样赋给,连符号一起作为数值传送例T3-9.cmain()unsigned int a;int b=-1;a=b;printf(“a=%u,b=%dn”,a,b);若b是正值且0-32767,则赋值后数

41、值不变,运算结果:a=65535,b=-1,3、复合的赋值运算符 在赋值号前加其它运算符,可以构成复合运算符。如:a=a+b a+=b x=x*(y+8)x*=y+8 x=x%3 x%=3 为了便于记忆,将赋值号左边移到赋值号右边,赋值号左边再补上变量名。如:a+=b a+=b a=a+b 其中a是变量,b是表达式 x*=y+8 x*=y+8 x=x*(y+8)注意括号 在C语言中,有十个二元运算符:+、-、*、/、%、&、|可与赋值号一起构成复合运算符;其优点是:简化程序,提高编译效率。,4、赋值表达式 赋值运算符将变量和表达式连接起来的式子。(1)一般形式:(2)赋值表达式求解过程:计算赋

42、值号右边表达式的值,然后赋给左边的变量。如:a=3+5 整个表达式的值就是被赋值的变量的值在C语言中,表达式又可以是赋值表达式,如:a=(b=5)其中 b=5是赋值表达式,其值是5,因此a的值是5,整个表达式的值是5。,(3)赋值运算符的结合顺序:从右向左因此:a=(b=5)与 a=b=5 是等价的。赋值表达式的例子:a=b=c=5 表达式的值为5,a,b,c的值为5。a=5+(c=6)表达式的值为11,a的值为11,c的值为6。a=(b=4)+(c=6)表达式的值为10,a的值为10,b为4,c为6。a=(b=10)/(c=2)表达式的值为5,a的值为5,b为10,c为2。,(4)赋值表达式

43、也可以包含复合的赋值运算符例T3-9-1.cmain()int a=12,b;b=(a+=a-=a*a);printf(“a=%d,b=%dn”,a,b);运算结果:a=-264,b=-264将赋值表达式作为表达式的一种的好处:灵活Printf(“%d”,a=b);,分解:1)a=a-a*a 12-144=-1322)a=a+a-132+(-132)=-264,3.10逗号运算符和逗号表达式逗号运算符:,逗号表达式:用逗号将两个表达式连接起来的式子。形式:表达式1,表达式2求解过程:先求表达式1的值,再求表达式2的值,整个表达式的值是表达式2的值。注:表达式1和表达式2又可以分别由若干个逗号表

44、达式组成。因此,逗号表达式又可扩展为:表达式1,表达式2,表达式n例:3+5,6+8 整个表达式的值是14 a=3*5,a*4 整个表达式的值是60,变量a的值是15,例T3-9-2.cmain()int a,b;b=(a=3*5,a*4),a+5);printf(“a=%d,b=%dn”,a,b);,运算结果:a=15,b=20,优先级问题?先看P78页最后一行,有无歧异?由于逗号运算符的优先级别最低,因此下面两个表达式的作用是不同的:(1)x=(a=3,6*3)整个表达式是赋值表达式,a值为3,x值为18(2)x=a=3,6*a 整个表达式是逗号表达式,其值是18,x,a的值均为3在后面讨

45、论的 for等语句中使用逗号表达式的目的,是要分别求出逗号表达式的值,而不一定是要得到整个表达式的值。说明:1.逗号运算符是一个顺序求值运算符(左结合性),例T3-9-3.cmain()int x,a=1,b=2,c=3;x=a,b,c;printf(“x=%dn”,x);运算结果:x=1例T3-9-4.cmain()int a=1,b=2,c=3,x;x=(a,b,c);printf(“x=%dn”,x);结果:x=3,2.并非所有出现“,”的地方都是逗号运算符,如函数中的参数分隔符-函数中的参数是用逗号隔开的例T3-9-5.cmain()int a=1,b=2,c=3;printf(“%d,%d,%dn”,a,b,c);printf(“%d,%d,%dn”,(a,b,c),b,c);,运算结果:1,2,3 3,2,3,作业,3.63.12,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号