《C语言第二讲数据类型运算符表达式.ppt》由会员分享,可在线阅读,更多相关《C语言第二讲数据类型运算符表达式.ppt(105页珍藏版)》请在三一办公上搜索。
1、第2章 类型、运算符与表达式,基本数据类型;常量和变量;标识符命名;常用运算符和表达式;运算符的优先级与结合性,本章只对基本类型中的前三类进行学习。,C语言的数据类型,是一种特殊的类型。表示一个量在内存中的地址。,函数调用后,不需要向调用者返回任何值,则可将该函数定为空类型。,int整数,在目前绝大多数机器上占4个字节TC2.0中是2个字节float单精度浮点数,一般占4个字节double双精度浮点数,一般占8个字节char字符,一般占1个字节用来表示256个ASCII字符,或者0255的整数,2-1 基本数据类型(Data Type),数据类型修饰符,shortshort int,短整数,一
2、般2个字节长。常简写为short longlong int,长整数,一般是4个字节长。常简写为longlong double,高精度浮点数,一般10个字节长。,signed用来修饰char、int、short和long,说明他们是有符号的整数(正整数、0和负整数)。一般缺省都是有符号的,所以这个修饰符通常省略 unsigned用来修饰char、int、short和long,说明他们是无符号的整数(正整数和0),常量和变量:数据在程序中的书写方式,2-2 常量与变量,在程序运行过程中值不变的量-常量,在程序运行过程中值可发生改变的量-变量,(一)常量,按类型分为:整型常量、实型常量、字符常量、字
3、符串常量、符号常量和枚举常量,(二)变量,命名规则:变量名由标识符表示,只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。,例如:下列标识符中,合法的变量名有:M.D.John 12%gf 1add _ce36 age&5thclass lotus-1-2-3 cd*ef,(在程序运行过程中值可发生改变的量),变量必须先定义,后使用。,目的:,1.保证程序中变量名使用正确,2.编译时为其分配相应的存储单元,3.编译时据此检查该量运算是否合法,说明:1.变量要“先定义,后使用”定义格式:类型说明符 标识符1,标识符2 标识符n 例如:int x,y,z;float a,b,c
4、,d;,使用变量的基本原则,所有变量必须在第一条可执行语句前定义 声明的顺序无关紧要 一条声明语句可声明若干个同类型的变量,变量名之间用逗号分隔变量定义后,即占用内存,可向其存入各种数据,并可通过变量名使用数据声明变量,是初始化变量的最好时机,使用变量的基本原则,char esc=a;int i=1;int sum=0;float eps=1.0e-5;,不被初始化的变量,其值为危险的随机数,变量赋初值,可以在定义变量的同时使变量初始化。但不可以在定义的同时连续赋值。,例如:int a=3;int a,b,c=5;int a=3,b=3,c=3;,int a=b=c=3;,6.选变量名时,要做
5、到“见名知意”例如:name st_age xm nl class sum7.大小写字母是两个不同的字符,变量名习惯用小写字母表示,使用变量的基本原则,(一)整型常量(由若干个数字组成),整型常量的几种表示形式:十进制、八进制、十六进制,整型常量的类型确定:长整型常量:常量后跟 L 或 l 来表示无符号整型常量:常量后跟 U 或 u 来表示无符号长整型常量:常量后跟LU或lu来表示,一、整型数据,十进制整数:以非0开头,由数字 09组成,可带正负号,18、-31长整型常数:123l、123L、123456l、123456L无符号型整数:123u、123U,如:,2.八进制整数:以数字“0”开始
6、的整型常数,由数字07组成,可带正负号,如:八进制整型数:012,03,04八进制长整型数:012433L,010和10大小不一样因为八进制并不常用,所以此种表示法比较少见,因而常被用错,3.十六进制整数:以“0 x”或者“0X”开始的整型常数,由AF和af组成,可带正负号,如:十六进制长整型数:0 x12,0 x3,0 x4十六进制长整型数:0X12DFL,十六进制的形式比较常用,尤其在进行位一级的控制的时候,(二)整型变量,整型变量分为:基本型(int)、短整型(short)、长整型(long)、无符号整型(unsigned),不同类型的变量所分配的字节数不同,即不同数据类型所表示的数的范
7、围是不同的,不同类型的量可以参与运算并相互赋值,类型转换是由编译系统自动完成的。,二、实型数据,实数在C语言中又称为浮点数,(一)实型常量,两种表现形式:1、十进制数形式 自然表示法 如 123.456,0.982、指数形式科学表示法 如:1.234e12 e指数符号,e前必须有数字,e必须为整数。,十进制小数形式:123.45、456.78指数形式 1e-2、4.5e3单精度实型常数:123.45f、456.78F、1e-2f、4.5e3F长双精度型常数:123.45l、456.78L、1e-2l、4.5e3L,实型常量的类型确定:实型常量隐含按双精度处理单精度实型常量:常量后跟 F 或 f
8、 来表示长双精度实型常量:常量后跟L或l来表示,(二)实型变量,如:float a;double d;,两种:单精度(float)、双精度(double),注:一般,单精度(float)类型提供7位有效数字双精度(double)类型提供16位有效数字,如:float a;double b;a=1234.667789/*实际机器中a=1234.667*/b=1234.667789/*实际机器中a=1234.667789*/,三、字符型数据,(一)字符常量用单引号引起的单个字符.如 a,A,5,%,$单引号内只能有一个字符,除非用“”开头,就是一个普通整数,也可以参与各种数学运算每个字符具有一个0
9、255之间的数值,可从ASCII表查出注意:5和5的区别,A和A的区别字符的数学运算在密码学内用得比较多,转义字符一种特殊形式的字符常量,以反斜线“”开头的字符序列,表示特定的控制功能一些特殊字符(无法从键盘输入或者在C语言里有它用)用转义字符表示,二、字符变量,一个字符变量只能存放一个字符,字符型变量占 1 个字节,定义形式:char 变量名表;,如:char person;person=m;,在字符型变量的存储单元中,存储的不是字符,而是该字符对应的ASCII码值。优点:1、可以字符形式或数值(整数)形式输出 2、可以参与运算。,(一)字符串常量:用双引号括起的一串字符.如 ABC,123
10、 中国,注:C语言规定,在每个字符串的结尾,系统自动加一个字符串结束标志0,不起任何控制动作,也不显示,四、字符串型数据,I am a string表示空字符串 转义字符也可以在字符串中使用 引号只作为字符串开始和结束的标志 C语言内部用0表示字符串的结束 除注释外,是唯一可以出现中文的地方x和x是不同的 里定义了一系列专门的字符串处理函数,字符常量与字符串常量的区别,字符常量 字符串常量 单引号 双引号 1个字符 多个字符字符变量 字符数组一个字节 字符串中字节数+1(0结束标志),引用形式:存放内容:赋值对象:占用空间:,例如:a a 不同 1个字节 2个字节,五、符号常量及const常量
11、,符号常量由宏来定义,宏:无参宏、有参宏,无参宏的定义形式:,1、符号常量用一个符号代表一个常量,例如:#define PI 3.1415926,五、符号常量及const常量,有参宏的定义形式:,1、符号常量用一个符号代表一个常量,例如:#define S(x)4*(x)*x+1,说明:符号常量必须先定义后才能用它表示一个数值 符号常量的值在其作用域内不能改变,也不能再 被赋值符号常量名习惯用大写字母表示,例:,#define PI 3.14159main()float r,s,v;scanf(“%f”,例:,#include#define S(x)4*(x)*x+1main()int k=5
12、,j=2;printf(%dn,S(k+j);程序运行后的输出结果是:,2、const常量,用const修饰定义的变量为常量const float pi=3.1425926;,常量只能在定义时赋值,不能再改变其值,常数、const常量、宏常量和枚举常量,均用来表示一个永远不会改变的数。,TC2中int的范围是-3276732767如果我们给它一个小于-32767或者大于32767的数会如何呢?现场编程测验,小蛇能吞下大象吗?,超出取值范围会怎样?,2.3 C运算符及表达式,算术运算符,自增、自减运算符 赋值运算符,逗号运算符 位式运算符及特殊运算符、关系运算符 逻辑运算符,条件运算符等。使用时
13、注意优先级别及结合性,1、运算符(5种):+(加):3+4、+3-(减):3-5、-5*(乘):3*5/(除):5/2、5.0/2(此二种形式,结果不同),一、算术运算符和算术表达式,%(取余)(取余运算的操作数只能是整数,且结果的符号与前一操作数的符号相同),如:,一、算术运算符和算术表达式,2、算术表达式(1)定义:用算术运算符和括号将操作数连 接起来的式子。格式:包括:常量、变量、函数(2)优先级:()*、/、%+、-(3)结合性:从左至右;(4)表达式的值:数值型(int、long、unsigned、float、double);,99.5+5,2.5,4.0-1.5,12.0/3,例:
14、知:float a=2.0;int b=6,c=3;求:a*b/c-1.5+a+fabs(-5)?,5,104.5(double),(5)类型转换,+97(int),3、取负运算符C语言的取负运算符为“”(负号),它是一元运算符。例:-5-5.36,+使变量的值自加1;-使变量值自减1+、-是单目运算符,右结合,两种形式:int n=1,i;i=n+;/*等价于i=n;n=n+1;*/int n=1,i;i=+n;/*等价于n=n+1;i=n;*/,后置:i+,i-,先使用i的值,再执行i+1或i-1,之后存入为i分配的内存单元中。前置:+i,-i,先执行i+1或i-1,之后存入为i分配的内存
15、单元中,再使用i的值。,4、自增与自减运算符(+、-),等价于j=i;i+;j的值为3,i的值为4,等价于i+;j=i;i的值为4,j的值为4,(1)i=3;j=i+;(2)i=3;j=+i;,4、自增与自减运算符(+、-),分析下面几种情况中i与j的值:,结合性:自右至左。,分析:“+”与”-“是同优先级,且都高于“=”按结合规则,等价于:j=-(i+);结果:j的值为-2,i的值为3。,如:i=2;j=-i+;,说明:,1.+、只能用于变量,不能用于常量或表达式。,例如:10,(x+y)+,+a,b+中合法的为:,2.自增、自减运算符为右结合性。,例如:a+,b+,(a+),3.常用于循环
16、变量自动加 1,4.表达式中运算符的组合,尽可能左结合,如:i+j(i+)+j,5.表达式中使用自加或自减运算时,需注意,如:i=3 K=(i+)+(i+)+(i+),结果:k=9,i=6,如:i=3 i=(i+)+(+i)+(i+),结果:i=14,6.调用函数时,实参的求值顺序为右到左,如:printf(“%d,%dn”,i,i+);,输出:4,3,不仅可读性差,而且因为编译器实现的方法不同,容易导致不同编译器运行效果不一样,贻害无穷!,常用的标准数学函数,包含在math.h头文件中,1、赋值运算符=功能:把=右边的表达式的值,存入=左边的变量名对应的存储空间,即给此变量赋值 3=2+1
17、a=a+2,二、赋值运算符和赋值表达式,2、赋值表达式:用赋值运算符将变量和表达式连接起来的式子 格式:=,y值为12,x值为3,表达式的值为3,y值为3,x值为3,表达式的值为3,(1)x=(y=12)/4(2)x=(y=12/4),二、赋值运算符和赋值表达式,结合性:自右至左(右结合性)例如:a=3;b=c+d;C规定:任何表达式在末尾加上分号就构成语句。如:A=B+C 表达式 A=B+C;语句,二、赋值运算符和赋值表达式,“=”号两端数据类型不同时进行转换 转换是系统自动进行的,右边转换为左边类型。规则如下:,(1)整型=实型 舍去小数部分(2)实型=整型 值不变,以浮点形式存放(3)整
18、型=字符型 值放入低8位,高8位为0(4)字符型=整型 仅将整型低8位存入,二、赋值运算符和赋值表达式,例:,程序运行结果为:x+k=40,y+k=10,main()int x,y,z,w;/*定义整型变量x,y,z,w*/unsigned int k;/*定义k为无符号整型变量*/x=10;y=-20;k=30;z=x+k;w=y+k;printf(“x+k=%d,y+k=%dn”,z,w);,3.复合赋值运算符及表达式 复合赋值运算符:在赋值符“=”之前加上其它运算符 共有10种复合赋值运算符+=,=,&,=,|=复合的赋值运算的作用:简化程序,提高编译效率。例如:a+=6 x*=y+3,
19、例如:a+=b 相当于 a=a+b a*=b 相当于 a=a*b,注意a*=b+c 相当于 a=a*(b+c)而不是 a=a*b+c例:若int x=6;,则x+=x-=x*x;x的值()。A.36B.-60C.60D.24分解为:x-=x*x 等价于:x=x-x*x x=6-6*6=-30 x+=等价于:x=x+(x-=x*x)=-30+-30=-60,3、复合赋值运算符,优先级:与=是同一优先级。结合性:自右至左。表达式的值:被赋值变量的值。,-264,0,练习:设a=12,计算表达式a+=a-=a*12和a+=a-=a*=12的值,分解为:a-=a*=12 等价于:a=a-(a=a*12
20、)a=a-(a=12*12)a=a-(a=144)=0,三、逗号运算符和逗号表达式,1.逗号运算符(顺序求值运算符):即“,”优先级:为所有运算符中级别最低的2.逗号表达式 形式:表达式1,表达式2,表达式n 求解过程:顺次求解表达式1,表达式2 最后求解表达式n逗号表达式的值为:表达式n的值(最后一个表达式的值),逗号运算符,多数情况下,并不使用整个逗号表达式的值,更常见的情况是要分别得到各表达式的值主要用在循环语句中,同时对多个变量赋初值等 for(i=0,j=0;ij;i+,j+),例如:a=3*5,a*4,(a=3*5,a*4),a+5,x=(a=4%3,a+1,a*10),表达式的值
21、为:60,表达式的值为:20,表达式的值为:10,例如: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,四、数据类型转换,C语言允许整型、实型、字符型数据进行混合运算。有3种转换方式:自动转换、赋值转换和强制转换。,(一)自动转换规则:,(1)不同类型数据运算,先转为同一类型,再进行运算(2)转换按数据类型长度增加的方向进行(低高、小大),横向箭头表示必须的转换 纵向箭头表示不同数据类型运算时的转换方向,特点:由数值存储位数少的向多
22、的转换;整型向实型转换!,(3)浮点运算均以双精度进行,(4)char 及short类型参与运算,均先转 换为int类型,(5)赋值运算时,以赋值号左边变量为准,(一)自动转换规则:,如:10 A+1.8-123.56*b,有下列几种情况:(1)实型 整型(字符型):去掉小数部分;,(二)赋值转换 在赋值时将赋值符右边值的类型转换成与其左边变量类型一致的类型。,char c=68.5;,(2)整型(字符型)实型:补足有效位;,float f=23;23.00000 f(7位)double f=A;65.0000000000000 f(15位),(二)赋值转换 在赋值时将赋值符右边值的类型转换成
23、与其左边变量类型一致的类型。#include main()double d=3.2;int x,y;x=2.5;y=(x+3.8)/5.0;printf(%d,%d,%dn,d*y,x,y);输出结果为:,如果一个运算符两侧的数据类型不同,先自动进行类型转换,然后再进行运算。,(5)类型转换,格式:(类型说明符)(表达式),例:(float)a;(int)(x+y);,注意:1、类型说明符及表达式均加圆括号。2、无论是强制转换,还是自动转换,都是暂时的并不改变原定义的类型3、强制类型转换时,得到所需类型的中间变量,原来变量的类型不会改变。,(三)类型强制转换,例如:int a=2,b=5;fl
24、oat x=4.4;表达式 结果(float)b/a(float)(b/a)(int)x%a+x,2.5,2.0,4.4,(三)类型强制转换,强转与指针,并称C语言两大神器,用好了可以呼风唤雨,用坏了就损兵折将,屠龙刀,倚天剑,类型强转,main()float f=5.75;printf(“(int)f=%d,f=%fn”,(int)f,f);,例:,运行结果:(int)f=5,f=5.75,例:,程序运行结果为:,main()int x=5,y=3,w;/*定义整型变量x,y*/float z=20,a;/*定义实型变量z,w*/a=(float)x/y;w=z/x%y;printf(“w=
25、%d,a=%fn”,w,a);,有语法错,应改为:w=(int)(z/x)%y;,五、位式运算(二进制位的运算),&按位与(二元运算)|按位或(二元运算)按位异或(二元运算)右移(二元运算)按位取反(一元运算),数的表示,原码编码规则:符号位0表示正,1表示负,数值部分不变。反码编码规则:正数的反码与原码相同;负数的反码是符号位为1,数值位按位取反。补码编码规则:正数的补码与原码相同;负数的补码是符号位为1,数值位先按位取反,然后末位加1。写出N1=+1010110、N2=-1010110的原码、反码和补码。N1原=01010110 N2原=11010110 N1反=01010110 N2反=
26、10101001N1补=01010110 N2补=10101010,五、位式运算(二进制位的运算),五、位式运算(二进制位的运算),例:main()int i;i=(21);/*左移1位*/printf(“%dn”,i);,输出为:4,使用位运算可以对字节或字内的二进制位进行操作,常用于编写系统软件。如在设备驱动程序的设计中,屏蔽某些特殊位。,友情提示,1、6种关系运算符:=!=2、关系表达式:用关系运算符将表达式连接起来的式子格式:包括:常量、变量、函数、表达式 优先级:(=)优先于(=!=)结合性:自左至右;表达式的值:若为真,则结果为1;若为假,则结果为0。,六、关系运算符和关系表达式,
27、35 值为:32 值为:设x=-2;-3x-1 值为:设x=1;2x4 值为:,求如下关系表达式的值:,0,0,0,1,不能用数学里习惯的关系运算符连用表示区间关系!,六、关系运算符和关系表达式,六、关系运算符和关系表达式,2.算术运算符(高)关系运算符 赋值运算符(低),优先次序:1.前种同级,高于后种(后种同级)例如:x!=y、s-db+c、bd、a=bc,关系运算符运算出的结果为0或10,表示假,即该关系不成立1,表示真,即该关系成立在所有涉及到真假判断的地方,0表示假,非0表示真,找别扭,int a=1;if(a=0)printf(OK);int a=0;if(a=0)printf(O
28、K);,int a=1;if(a=0)printf(OK);int a=0;if(a=0)printf(OK);,=和=,int a;a=0;a=1;,int a;a=0;a=1;,一定要分清=和=下面用法能起点小作用:,int a=0;if(0=a)printf(OK);,int a=0;if(0=a)printf(OK);,编译出错,关系表达式用关系运算符连接起来的式子 值为逻辑型。(1,0)如:(ab)(by、s+fd 语言没有逻辑型数据,关系表达式的真、假是以 数值“”代表“真”,以“”代表“假”。,例:设A=3,B=2,C=1 则:AB 值为1(AB)=C 值为1D=AB 值为1 F
29、=ABC 值为0,七、逻辑运算符和逻辑表达式,C语言提供三种逻辑运算符:&(逻辑与)|(逻辑或)!(逻辑非),逻辑运算也称布尔(Boolean)运算,运算结果也是1和0,优先级:!高于&高于|混合运算中:!高 算术运算 关系运算&、|赋值运算 低,注:如何判断一个逻辑表达式为“真、假”?用“非”代表“真”,用“”代表“假”。如:b&0 值为:“0”,int a=5;float b=3.5;表达式 结果 表达式 结果!a 0!(a 0)0(a 0)1,例如,逻辑表达式:,运算结果为逻辑值编译系统以非0、0判定逻辑值真、假 逻辑表达式中作为参加逻辑运算的运算对象可以是0或非0数值。但要区分运算对象
30、。例:53&2|84-!0 值为 1,逻辑表达式与关系表达式的区别:逻辑表达式:用表达式的值等于0或不等于0来判断条件是否成立.不等于0,则结果为“真”;等于0,则结果为“假”例:int x=-2;if x printf(hello);/*结果为输出hello*/,关系表达式:结果为“真”或“假”,关系表达式成立(为“真”),则关系表达式的值 等于1,否则(“为假”),等于0。例:int x=1,y=2,k;k=xy;,对于逻辑表达式:关心的是表达式的值 值为非0,则结果为“真”值 等于0,则结果为“假”,对于关系表达式:关心的是表达式是否成立 若关系表达式成立(为“真”),则关系表达式的值
31、等于1,否则(“为假”),等于0。,条件运算:根据条件确定某个表达式结果 的值。(C语言中唯一 的一个 三目运算)运算符:?和:条件表达式形式:表达式1?表达式2:表达式3,八、条件运算符和条件表达式,执行过程:,(2)结合方向为“右到左”,(1)条件运算优于赋值运算例如:int max,a=5,b=3;max=ab?a:b 求max的值max的值为5,说明:,例:设a,b,c,d的值为1、2、3、4求下述表达式的值 max=ab?a:cd?c:d 等价于 max=ab?a:(cd?c:d)结果为:4,(3)条件表达式中,各表达式类型可不同 例:xy?1:1.5 若x=y则值为1.5,否则值为
32、1.0 表达式值的类型为两者中较高类型(整变实)例:x?a:b 若 x为0则值为b,否则(非0)值为a,九、求字节运算符:sizeof 作用:求得变量或某种数据类型所需的 字节数。,一定要有空格,形式有两种:sizeof 变量名 sizeof(类型名)结果为整型数。,int a;float x;printf(%d,%dn,sizeof a,sizeof(x);printf(%d,%dn,sizeof(int),sizeof(float);以上两个printf语句结果均为。,九、求字节运算符:sizeof,2,4,例如,一元变换:&取地址*取内容,此外,还有:,()-.!+-+-*&(类型)si
33、zeof*/%+-=!=&|&|?:=+=-=*=/=%=&=|=,优先级,优先级,能背下优先级表的人凤毛麟角脑细胞太宝贵了,不能用来死记硬背用括号来控制运算顺序更直观、方便,并减少出错的概率先算乘除,后算加减,有括号就先算括号里的括号太多,有时候不清晰注意用空格做好分隔实在不行就拆分表达式,这一章我们学到了,标识符的命名规则数据类型char,short,int,long,float,double,long doublesigned,unsignedenum常数、转义字符算术运算、关系运算、逻辑运算、加一/减一运算、位运算、赋值运算类型转换?:优先级,作业:1.下列程序中格式错误的是()。A.
34、a=2:b=3;B.int a,b,z;C.main()D.z=a+b;2.在C语言中要求参加运算的数必须是整数的运算符是()。A./B.!C.%D.=3.若 char w;int x;float y;double z;则表达式w*x+z-y的结果为()类型。A.charB.intC.floatD.double4.下列能正确表述1212后,x的值为()。A.不定值B.3C.2D.46.以下选项中合法的字符常量是()。A.B B.015C.68D.F,作业:7.假定x和y为double型,则表达式:x=2,y=x+3/2的值是()。A.3.500000B.3C.2.0000008.设a,b,c均
35、为int型变量,且a=4、b=6、c=5,则表达式ac的值为()。A.0B.1C.2D.39.short int 类型的数据长度为2个字节,则unsigned short int 类型数据的取值范围是()。A.0到255B.0到65535C.-32768到32767D.-256到255,14.算术运算符、赋值运算符和关系运算符的运算优先级按从高到低的顺序依次为()。A.算术运算符、赋值运算符、关系运算符B.关系运算符、赋值运算符、算术运算符C.算术运算符、关系运算符、赋值运算符D.关系运算符、算术运算符、赋值运算符15.若变量已正确定义且k的值是4,计算表达式(j=k-)后,()。A.j=3,k=3B.j=3,k=4C.j=4,k=3D.j=4,k=416.C语言程序中可以对程序进行注释,注释部分必须用符号()括起来。A.和B.和C.“/*”和”*/”D.“*/”和”/*”17.若变量已正确定义,表达式(j=3,j+)的值是()。A.3B.4C.5D.018.以下选项中,对基本类型相同的指针变量不能进行运算的运算符是()。A.+B.-C.D.,C语言对标识符有些什么规定?答:(1)标识符用来表示函数、类型及变量的名称。(2)是字母、下划线和数字的排列,但必须用字母或下划线开头。(3)大小写字母含义不同。(4)最长允许32个字符。(5)不能与关键字相同。,