《数据与数据类型.ppt》由会员分享,可在线阅读,更多相关《数据与数据类型.ppt(68页珍藏版)》请在三一办公上搜索。
1、1,第 2 章 数据与数据类型,2,主要内容,3,2.1 C 的基本数据类型,整数类型,字符类型,实数类型,枚举类型,4,2.1 C 的基本数据类型,5,2.1.1 整数类型,整型常量的表示方法:,十进制整数:125,0,256,八进制整数:以数字 0 开头的数字序列 0123(123)8 182281380(83)10,十六进制整数:以 0 x 开头的数字序列 0 x123(123)16 116221613160(291)10,6,2.1.1 整数类型,整型变量的分类:,基本整型:用 int 表示,短整型:用 short int 表示,或用 short 表示,长整型:用 long int 表
2、示,或用 long 表示,7,2.1.1 整数类型,整型变量的分类:,有符号基本整型:signed int,无符号基本整型:unsigned int,有符号短整型:signed short int,无符号短整型:unsigned short int,有符号长整型:signed long int,无符号长整型:unsigned long int,8,2.1.1 整数类型,ANSI标准关于整数类型的规定,9,说明,在微机上,用 long 型可得到大范围的整数,但同时会降低运算速度,一个整型常量后面加一个字母 u 或 U,认为是unsigned int 型,一个整型常量后面加一个字母 l 或 L,认
3、为是 long int 型常量,10,2.1.2 字符类型,字符常量:一对单撇号括起来的单个字符,注意:,a 与 A 是不同的字符常量,单撇号是分隔符,不能用双撇号代替单撇号,不能用一对单撇号括起来做为字符常量,字符常量本身具有数值,其数值就是它的ASC代码值,a A?#,11,2.1.2 字符类型,转义字符:以一个 开头的字符序列,如 n,12,2.1.2 字符类型,字符变量:,char c1,c2;c1=a;c2=b;,在所有的编译系统中都规定以一个字节来存放一个字符,13,2.1.2 字符类型,字符型数据在内存中是以其相应的 ASC 代码存放的,char c1,c2;c1=a;c2=b;
4、,14,说明,一个字符数据既可以字符形式输出,也可以一个整数形式输出。以字符形式输出时,先将存储单元中的 ASC 码转换成相应字符,然后输出;以整数形式输出时,直接将其ASC码作为整数输出,一个整数(当然此整数只限于与字符相对应的整数)也可以用字符形式输出,字符数据可以作为整数参加运算,相当于对它们的 ASC码进行运算,字符数据与整型数据可以相互赋值,int i;char c;i=a;c=97;,15,2.1.2 字符类型,#include void main()char c1,c2;c1=97;c2=98;printf(%c,%cn,c1,c2);printf(d,%dn,c1,c2);,a
5、,b 97,98,16,2.1.2 字符类型,#include void main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(%c,%cn,c1,c2);,A,B,17,2.1.2 字符类型,字符串常量:一对双撇号括起来的零个或多个字符序列,说明:,以双撇号为定界符,但双撇号不属于字符串常量,双撇号中的字符不能是:,hello C Programming Language a,字符串:I say:Goodby!应写为:I say:Goodby!,注解:”表示双引号字符,是个转义字符,18,2.1.2 字符类型,字符串常量:一对双撇号括起来的零
6、个或多个字符序列,说明:,不要将字符常量与字符串常量混淆,hello C Programming Language a,char c;c=a;,a a,注解:“a”占两个字节,a占一个字节,19,2.1.2 字符类型,注意:,在输出一个字符串常量时不输出字符串结束标志 0,在写字符串时,不必加 0,系统是自动加上的,在 C 语言中没有专门的字符串变量,字符串结束标志:0 ASC码值为 0,C 语言规定,每一个字符串的结尾之处都要由系统自动加上一个“字符串结束标志”,以便于判断该字符串是否结束,20,2.1.3 实数类型,实型常量的表示方法:,十进制小数形式:由数字和小数点组成.123 123.
7、0,指数形式:123 e 3 或 123 E 3 都表示 123103,123.456 e 0 12.43563 e 1 1.23456 e 2 0.123456 e 3,规范化的指数形式,21,2.1.3 实数类型,实型变量:,单精度型:float,双精度型:double,长双精度型:long double,22,2.1.4 枚举类型,“枚举”是指将变量的值一一列举出来,变量的值仅限于列举出来的值的范围内。定义枚举类型的变量可以采用以下方法:,先定义一个枚举类型标识符,然后用该标识符定义变量,enum 枚举类型标识符 枚举元素1,枚举元素2,.,枚举元素n;enum 枚举类型标识符 变量列表
8、;,enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday workday,week_end;,23,在 C 编译中,对枚举元素按常量处理,故称枚举常量。它们不是变量,不能对它们赋值,枚举元素作为常量,它们是有值的,C 语言编译按定义时的顺序使它们的值为 0,1,2.,workday=mon;,也可以改变枚举元素的值,在定义时由程序员指定,enum weekday sun7,mon,tue1,wed,thu,fri,sat;,说明,24,说明,枚举值可以用来做判断比较,一个整数不能直接赋给一个枚举变量,if(workday=mon).if(w
9、orkday sun).,workday=(enum weekday)2;workday=(enum weekday)(5 3);,25,2.2 常量与变量,常量,变量,26,2.2.1 常量,常量:在程序的执行过程中其值不能被改变的量,235,-54,2.3,a,c,符号常量,27,#include void main()double area(double r),circum(double r);printf(area=%f,area(2.0);printf(t circum=%f,circum(2.0);,double area(double r)return(3.141592654*r
10、*r);,例,符号常量的使用,double circum(double r)return(2.0*3.141592654*r);,28,例,符号常量的使用,#define PI 3.141592654/*定义符号常量*/#define R 2.0void main()double area(double r),circum(double r);printf(area=%f,area(R);printf(t circum=%f,circum(R);,double area(double r)return(PI*r*r);,double circum(double r)return(2.0*PI*
11、r);,29,说明,符号常量一旦被定义在预编译时就将程序中凡出现符号常量名的地方一律用常量表达式或字符串代替,习惯上,符号常量名用大写,变量名用小写,以示区别,符号常量不同于变量,它的值在其作用域内不能改变,也不能被赋值,使用符号常量可以提高程序的可读性及常量修改的一致性,30,2.2.2 变量,变量:其值可以改变的量,31,C 语言允许在定义变量的同时可以对变量赋初值,也称为变量的初始化,int a=3;float f=3.56;char c=a;,2.2.2 变量,变量初始化:,32,说明,在进行变量赋初值时,也可以使被定义的变量的一部分赋初值,int a,b,c=5;,若要对上述三个变量
12、都赋予初值 3,应写成:,int a=3,b=3,c=3;,int a=b=c=3;,33,说明,对变量的初始化不是在编译时完成的,而是在执行程序时对相应的变量赋初值的,int a=3;相当于 int a;a=3;,在执行程序时,任何一个变量在使用之前一定要有明确的值,否则将会出现错误 注意!,int i,j;j=i+3;,34,2.3 运算符与表达式,运算符与表达式的概念,算术运算符与算术表达式,逻辑运算符与逻辑表达式,关系运算符与关系表达式,赋值运算,逗号运算,位运算,35,2.3.1 运算符与表达式的概念,运算符的功能,与运算量的关系,运算符的优先级 单目运算符高于双目,要求运算量的个数
13、:双目运算符、单目运算符,要求运算量的类型,结合方向,左结合性 3*5/6,右结合性,结果的类型,即表达式值的类型,36,2.3.2 算术运算符与算术表达式,加法运算符,减法运算符,*乘法运算符,/除法运算符,模运算符或称求余运算符,37,2.3.2 算术运算符与算术表达式,这五种算术运算符都是双元运算符,优先级别是:*、/、同级别,、同级别但低于*、/、。结合方向均为“自左至右”,即左结合性,为求余运算符,C 语言规定参加求余运算的数必须是整数,如果参加、*、/运算的两个数中有一个为实数,则结果为 double 型,两个整数相除的结果为整数,如 5/31,舍去小数部分。但如果除数或被除数中有
14、一个为负值,则多数机器采取“向零取整”的方法,如-5/3=-1,38,自增、自减运算符,i,i:后缀形式 先引用后增值,i,i:前缀形式 先增值后引用,39,自增、自减运算符,自增、自减运算符只能用于变量,不能用于常量或表达式。如:5、(a b)都是错误的,结合方向是“自右至左”。如 i 相当于(i),printf(%d,i+);(i 的原值为 3),自增、自减运算符常用于循环语句中,使循环变量自动加1或减1,也可用于指针变量,使指针指向下一个地址,40,2.3.3 逻辑运算符与逻辑表达式,C 语言提供了 3 种逻辑运算符:,&逻辑与|逻辑或!逻辑非,41,2.3.3 逻辑运算符与逻辑表达式,
15、逻辑运算的真值表,42,2.3.3 逻辑运算符与逻辑表达式,&和|是双目运算符,要求两个运算量;!是单目运算符,要求一个运算量,!(非)&(与)|(或),即!为三者中最高的,逻辑运算符中的&和|低于关系运算符,!高于算术运算符,43,2.3.3 逻辑运算符与逻辑表达式,若 a=4,则!a若 a=4,b=5,则 a&b若 a,b 的值同前,a|b若 a,b 的值同前,!a|b 4&0|2,3&8 4!01&84-1 结果为0,C 语言在给出逻辑运算结果时,以数值 1 代表“真”,以数值 0 代表“假”。在判断一个量是否为真时,以 0 代表“假”,以非0 代表“真”,44,2.3.3 逻辑运算符与
16、逻辑表达式,说明:,逻辑运算符两侧的运算对象不但可以是 是 0 和非 0 的整数,也可以是任何类型的数据,系统最终以 0 和非 0 来判定它们属于“真”或“假”,c&d a&0,在逻辑运算中,有一些规则,掌握它们可以使运算更加简化,在一个&表达式中,若&的左端为 0,则不必再计算右端,该表达式的值必然为 0,0&a 0a&0 0,45,2.3.3 逻辑运算符与逻辑表达式,说明:,在逻辑运算中,有一些规则,掌握它们可以使运算更加简化,在一个|表达式中,若|的左端为非 0,则不必再计算右端,该表达式的值必然为 1,1|a 1a|1 1,关于表达式的值的规律有如下一些:,0|a a!a|a 1a|a
17、 a!(!a)a1&a a a&!a 0 a&a a!(a|b)!a&!b!(a&b)!a|!b,46,2.3.3 逻辑运算符与逻辑表达式,#include void main()int a=1,b=2,c=3,d=4,m=20,n=20;(m=a b),47,2.3.4 关系运算符与关系表达式,C 语言提供了 6 种关系运算符:,(大于)=(大于等于)(等于)!(不等于),优先次序:,前 4 种关系运算符的优先级别相同,后两种相同;前4种的优先级别高于后两种,整个关系运算符的优先级别低于算术运算符,高于赋值运算符,48,2.3.4 关系运算符与关系表达式,c a+b等效于 c(a+b)a b
18、=c等效于(a b)=ca=b c等效于 a=(b c),关系运算符的结合性是自左向右,49,2.3.4 关系运算符与关系表达式,用关系运算符将两个表达式连接起来的式子称为关系表达式,a b a+b b+c(a=3)(b=5)a b,说明:,关系表达式的值只有两个:关系表达式成立,即为“真”以“1”表示;关系表达式不成立,即为“假”,以“0”表示,int x=2,y=3;则表达式:x=yx=x+1=y+2,50,2.3.4 关系运算符与关系表达式,说明:,要说明 x 在区间 a,b 中,普通数学中使用表达式 axb,但 C 语言中的表达式“a=x=b”的含义与之不同,假设:a=0,b=0.5,
19、若 x 0.3 则:a=x=b,应写为:a=x&x=b,表达式 5 2 7 8 在数学上是不允许的,而在 C 语言中是允许的,按自左而右求解,51,2.3.4 关系运算符与关系表达式,说明:,由于关系表达式的值是整型数 0 或 1,故也可以将其看成是一种整型表达式,int i=1,j=7,a;a=i+(j%4!=0),字符数据的比较按其 ASC 码值进行,a 0A 100,52,2.3.5 赋值运算,变量表达式;a=1;a=a+1;b=a;a=a+b;,“”是赋值符号,不是等于号,运算方向是自右至左,即将“”右侧表达式的值赋给“”左侧的变量,计算步骤为先计算表达式的值再向变量赋值,赋值表达式的
20、值为被赋值后变量的值,说明:,可以将一个赋值表达式的值再赋给另一个变量,b=a=3+5 等价于 b=(a=3+5)赋值表达式作为左值时,要加括号,53,2.3.5 赋值运算,复合的赋值运算符:,在赋值运算符“”之前加上、*、/、&、|这 10 种双目运算符,可构成复合的赋值运算符,a+=3 等价于 a=a+3x*=y+8 等价于 x=x*(y+8)x%=3 等价于 x=x%3赋值运算中右侧的表达式可以是另一个赋值表达式,其中可含有复合的赋值运算符 a+=(a-=a*a),54,2.3.6 逗号运算,逗号运算符:“,”,也称顺序求值运算符,逗号表达式:用逗号将若干个表达式连接起来,其一般形式:,
21、表达式 1,表达式 2,表达式 n,55,2.3.6 逗号运算,一个逗号表达式有一个值,就是最后一个表达式的值,逗号运算符是所有运算符中优先级别最低的 a=3*5,a*4,一个逗号表达式又可以与另一个表达式组成一个新的表达式(a=3*5,a*4),a+5,说明:,逗号表达式最常用于循环语句中,并不是任何地方出现的逗号都是作为逗号运算符 printf(%d,%d,%d,a,b,c);,56,2.3.7 位运算,57,2.4 数据类型转换,自动转换,强制转换,58,2.4.1 自动转换,各类数值型数据间的混合运算,10+a+i*f d/e,59,2.4.1 自动转换,赋值运算的类型转换,如果赋值运
22、算符两侧的类型不一致,但都是数值型或字符型,在赋值时要进行类型转换,60,2.4.2 强制转换,转换形式:(数据类型)(表达式),注意:,当表达式为单个变量时,可省略其括号,(double)a,除此之外,表达式应当用括号括起来,(int)(x+y)而不应写成(int)x+y,强制类型转换是一种单目运算,各种数据类型的标识符都可用来做显式转换运算符,但必须用圆括号把类型标识符括起来,61,2.4.2 强制转换,通过强制类型转换,只是得到了一个所需类型的中间变量,原变量或表达式的值和类型并未发生变化,62,2.4.2 强制转换,在 C 语言中存在两种类型的转换:一种是在运算时不必用户指定,系统自动
23、进行的类型转换;另一种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换,63,课堂练习,已知各变量的类型说明如下:int i=8,k,a,b;unsigned long w=5;double x=1.42,y=5.2;则以下符合 C 语言语法的表达式是_A:a+=a-=(b=4)*(a=3)B:a=a*3=2=左侧必须为变量C:x%(-3)参加取余的必须为整型D:y=float(i)float要用括号括起来,64,课堂练习,已知字母 A 的 ASCII 码为十进制数 65,且 c2 为字符型,则执行语句 c2=A+6-3;后,c2 中的值为_A:DB:69C:不确定的值D:C,
24、65,课堂练习,若有以下定义,则能使值为 3 的表达式是_int k=7,x=12;A:x%=(k%=5)B:x%=(k k%5)C:x%=k k%5D:(x%=k)-(k%=5),66,课堂练习,若有以下定义:int m=5,y=2;则计算表达式 y+=y-=m*=y 后的 y 值是_,-16,若 a 是 int 型变量,则下面表达式的值为_(a=4*5,a*2),a+6,26,若 x 和 n 均是 int 型变量,且 x 和 n 的初值均为 5,则计算表达式后 x 的值为_,n 的值为_ x+=n+,6,10,67,课堂练习,若希望当 A 的值为奇数时,表达式的值为“真”,A 的值为偶数时,表达式的值为“假”。则以下不能满足要求的表达式是_A:A%2=1B:!(A%2=0)C:!(A%2)D:A%2,68,课堂练习,判断 char 型变量 c1 是否为小写字母的正确表达式为_A:a=a)&(c1=c1)|(z=a)&(c1=z),