《第2章 数据类型与表达式.ppt》由会员分享,可在线阅读,更多相关《第2章 数据类型与表达式.ppt(48页珍藏版)》请在三一文库上搜索。
1、第 2 章 C语言的基本数据类型与表达式,2.1 C语言的基本数据类型 2.2 常量与变量 2.3 运算符与表达式 2.4 数据类型转换,教学目的和基本要求:,要求学生清楚数据类型与变量、常量的关系,掌握各种常量的性质和定义,掌握表达式中各种运算符的功能和特点,明白产生副作用的原因,了解数据类型的相互转换规则。,教学重点:,数据类型、常量定义,运算符与表达式。,存取数据必须先确定数据的编码方式、存储格式和所占的存储长度, C语言中把这三者结合起来,给出几种固定的形式,这些形式就是最基本的数据类型。,2.1 C语言的基本数据类型,为什么要设置数据类型?,在计算机中使用一定长度的存储单元(通常是字
2、节的倍数)来存储数据。,存储的编码方式有:原码、反码、补码、ASCII码。 存储的存储格式有:定点型、浮点型。,其中,用于存储数据的存储单元的长度决定了数据取值范围的大小。,一、数据类型概述,本章中将对基本类型中的前三类进行介绍和学习。,变量:指以标识符为名字,其值可以改变的量。,在学习各种数据类型之前,我们先简单了解一下常量和变量的概念。后面的章节中将会详细介绍。,常量:指在程序运行中,其数值不能被改变的量。,变量 代表计算机内存中的某一存储空间,变量的类型决定了该存储空间的长度和其中存放数据的编码方式及存储格式。 变量的类型也决定了该存储空间中存放数据的数据形式和取值范围。,直接用数字等符
3、号表示!,内容不定,用标识符来说明存放的空间!,* 八进制的数码范围为07; 018 * 十六进制的数码除了数字09外, 还使用英文字母a f (或A F)表示1015。 如:0x1e ,注意!,二、整型(采用定点整数的存储格式,只能表示纯整数),1、整型常量:,(1) 十进制形式:与数学上的整数表示相同; 例如: 12, -100, 0 (2) 八进制形式:在数码前加数字0; 例如: 012=1*81+2*80=10(十进制) (3) 十六进制形式:在数码前加0X(数字0和字母X)。 例如: 0x12=1*161+2*160=18(十进制),如Turbo C中,有 short(2字节)int
4、(2字节) long(4字节) 关键字 所占位数 取值范围 short 16 -3276832767 unsigned short 16 065535 int 16 -3276832767 unsigned 16 065535 long 32 -21474836482147483647 unsigned long 32 04294967295,2、整型变量的分类(用表示符来说明):,根据数据所占的存储长度的不同分为:int、short、long; 同样存储长度的数据又分unsigned、signed; 故可组合出六种类型。,3、整型变量的值域:,由机器中数据的存储长度决定,思考:int a=2
5、0000,b=20000,c; c=a+b; c的值为多少? 如果c定义为long型是否能解决问题?,2、实型变量的分类及值域: 关键字 字节数 取值范围 精度(位) float 4 3.410-38 3.41038 7 double 8 1.710-308 1.710308 15,注意,三、实型,1、常量: (1) 十进制小数形式:由数字和小数点组成; 例如: 3.4, 4., .3。 (2) 指数形式:“十进制小数”+“ e(或E)”+“十进制数整数”。 例如: 12.5e-6 表示12.510-6 。, 小数点不能单独出现; 0. .0 . e或E的两边必须有数,且其后面必须为整数; 如
6、: 6E0.2 e5 ,字符形式 功能 n 换行 t 横向跳格 b 退格 r 回车 反斜杠字符 单引号字符 ddd 8进制数表示的ASCII码对应的字符 xhh 16进制数表示的ASCII码对应的字符,四、字符类型,1、常量: (1) 用单引号括起来的一个字符;如:A、 1、?等。 (2) 用单引号括起来的由反斜杠()引导的转义字符。,4、字符串常量: 是用一对双引号括起来的字符序列。 注意:每个字符串的后面都有一个0结束符。 如:“SHANGHAI”,“AbcdeFGHijk”,“How are you”。,注意, a与“a”的区别。,例如:字符A的ASCII码为: 65D(十进制)=41H
7、(十六进制)=101o(八进制) 字符A可以表示为A、x41、101。,2、字符型变量的分类: char 和 unsigned char;,3、值域(字符型可参与数学运算,也可看成一种一字节的整型变量) 每个字符型数据在内存中占一个字节;包括ASCII字符表中的所有字符(可显示字符和非显示字符)。,一、常量与符号常量 常量是指在程序运行中,其数值不能被改变的量。 常量又可分为直接常量和符号常量。,2.2 常量与变量,1、直接常量:是在程序中直接引用的数据。,-整型、短整型:占2字节,取值-3276832767 ( -215215-1), 10、-5,十六进制0x76、-0x8af,八进制067
8、、012。,长整型:占4字节,取值-231231-1 xxL:-10L、0xafL,(L、l均可) 浮点:常数浮点占8byte,取值-1030810308,17位有效数字,小数长度6位; 两种表示方法1.23,5.0;1E2、-2e10(前后不能省略,指数为整) 错例:e6、1e6.0、2e,字符常量:用符号和符号占一个字节 与ASCII表对应,可以表示控制符,也可直接用r,n,t 此处表示转义,“, 对16及8进制可直接写成HEX:x0d,OCT:12.11但必须在ASCII范围内,#include void main() printf(“%c“,65); printf(“%d“,65);
9、,占用空间:字符个数+1,最后1个byte用来存放字符串的结束符0,表示:“xxx“。,-字符串常量:,试说明:A与“A”在C中的区别?,字符串中转义字符有作用, 例:#include void main() printf(“abcdtefg“); ,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.4
10、E+4.8、E9 ; “changsha“ 、“+?ab“ ; 、ab ;,请判断这些常量正确与否:,#include void main() printf(“example dec=%d,hex=%x,oct=%o“,26,26,26); printf(“sdec:%d,hex:%x,oct:%o, flof:%f,floe:%e“,26,0x26,026,0.26,2e6 ); ,定义形式: #define 标识符 常量数据 例如: #define PI 3.14159 在程序预处理时,凡是出现标识符PI的地方都将用 数据3.14159来替换。 如: 2*2.3*PI 就等价于 2*2.3
11、*3.14159。,2、符号常量 是用标识符来表示一个数据;在程序不能给它赋值。,程序头,无分号结尾 #include #define PI 3.14 #define area 560 void main() printf(“PI=%f,area=%d“,PI,area); , 变量是指以标识符为名字,其值可以改变的量。 变量代表计算机内存中的某一存储空间,该存储空间 中存放的数据就是变量的值。 在同一程序块中,变量不能被重复定义。 使用变量时必须“先定义,后使用”。,二、 变量,2、变量初始化 在定义变量的同时给变量一个初始值。,注意,int a=5, b=3; int a=b=c=3; i
12、nt a,b,c; a=b=c=3; ,例如:int a,b,c ; float x,y; char c1,c2; 或 int c1,c2; 定义变量就是在内存中划出一块相应类型的存储空间存放该变量的值。,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); ,例2-1:,程序运行结果为: x+k=40,y+k=10,变量根据作用域的不同可分为局部变量和全局变量,根据存储方式的不同可分为
13、静态存储变量和动态存储变量,这些我们将在第六章中详细介绍。,在数学里当多个运算符一起组成一个表达式时,我们规定了优先级(先乘除后加减)和结合规则(从左至右)。 同样,在C语言中,我们也规定了每个运算符的结合规则及运算符之间的优先级。,2.3 运算符与表达式,运算符:就是表示某种运算功能的符号。 按操作功能运算符大致可分为:算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符、逗号运算符以及按位运算符等。,表达式:是由操作数和运算符组成的序列。 如:1+2*3-4 、 35-7 、a=b%2 等都是C语言中的表达式。,下面分类介绍各种运算符:,%(取余)(注意:取余运算的操作数只能是整数,
14、且结 果的符号与第一操作数的符号相同),一、 算术运算符和算术表达式,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整除,2、算术表达式 用算术运算符和括符将操作数连接起来的式子。 优先级:() *、/、% +、- 结合性:从左至右; 表达式的值: 数值型(int、long、unsigned、float、double);,例如: 已知: float a=2.
15、0; int b=6,c=3; 求解: a*b/c-1.5+a+fabs(-5)=?,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的结果是多少? int a=10000,b=30000; 表达式a+b的结果是多少? 如何修改?,#include void main() float y=0; y=-11%3+5+5*6%7+4.0/3; printf(“=%3.3f“,y); ,
16、-2+5+2+1.333=6.333,等价于:j=i;i+; 所以i的值为4,j的值为3,等价于:i+;j=i; 所以i的值为4,j的值为4,(1) i=3; j=i+; (2) i=3; j=+i;,3、自增与自减运算符 (+ 、-), +i,-i:使用之前使i的值增1(或减1);, i+,i-:使用之后使i的值增1(或减1);,分析下面几种情况中i与j的值:,当+、 -不与其他运算符混合使用时,+i与i+都等价于 i=i+1, -i与i-都等价于 i=i-1,如:i = 2; j = -i+; 求执行完这两句后i与j的值分别是多少,特殊的:设i=3,j=4,k=i+j, k= i= j=,
17、 结合性:自右至左。,分析:“+”与”-“是同优先级,且都高于“=” 按结合规则,等价于: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,#include void main() int x=1,y=10; y=(+x)+x+(+x)+; printf(“x=%d,=%d“,x
18、,y); ,x=6,=9,1、6种关系运算符:= = != 2、关系表达式:用关系运算符将表达式连接起来的式子 优先级: (= )( = != ) 结合性:自左至右; 表达式的值: 若为真,则结果为1; 若为假,则结果为0。,35 值为: 32 值为: 设x=-2; -3x-1 值为: 设x=1; 2x4 值为:,例如,二、关系运算符和关系表达式,求如下关系表达式的值:,0,0,0,1,算术运算符优先级高于关系运算符 3+(43)*4 值为: 3+43*4 值为,3,1,注意,不能用数学里习惯的关系运算符连用表示区间关系!,2、逻辑表达式:用逻辑运算符将表达式连接起来的式子 优先级: ! &
19、| 结合性:自左至右; 表达式的值: 若为真,则结果为1; 若为假,则结果为0。,三、逻辑运算符和逻辑表达式,1、3种逻辑运算符: & | !,参与逻辑运算的操作数叫逻辑量。,逻辑量可以是整型、实型、字符型和指针类型, 其中,0,0.0,0,NULL代表假,其余逻辑量代表真。,!是一元运算符优先级高于所有二元运算,逻辑的优先级低于关系运算 运算结果:真、假(对应数1、0 ) 所有非0的数都可表示为真,( 对整个数的运算、以真形式参加运算) 如:!x表达式的值是:若x!=0时则其值=0,若x=0时为1,int a=5; float b=3.5; !a ( ) !(a 0) ( ) (a 0) (
20、 ) int a=0,b=1,c=1; printf(“a,例如,0,1,1,0,0,0,1,1,0,0,0,1,a& b|c,例如表达式运算如下:,混合优先级: ! 高 算术运算符 关系运算符 &和| 赋值运算符 低,4 - 0,1 & 2,8 4,1,0,1,5 3 & 2 | 8 4 - !5,#include void main() int a=0,float b=1.1; printf(“x=%d“,!a1|!b-1.1); ,11|0-1.1 0|-1.1 1,例如: (1)a = 0,b = 1; c = a+ 执行后: a为 ,b为 ,c为 。,逻辑或优化和逻辑与优化:,在逻辑
21、表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。,1,1,0,(2)a = 1; b = 1; c=0; d = -a b- (c = b+3 ); 执行后: a为 ,b为 ,c为 ,d为 。,0,0,0,1,#include void main() int a = 0,b = 1,c; c = a+ ,例如: (1) n是小于m的偶数: (2)year是闰年: (能被4整除但不能被100整除,或能被400整除),逻辑表达式一般用于控制语句中的条件:,n m & n % 2 = 0,year % 4 = 0 & year %
22、100 != 0 | year % 400 = 0,例如:(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,表达式的值
23、为3,y值为3,x值为3,表达式的值为3,5位运算,运算符:反(一元)、a1=a,A :0x41 = 0100 0001 ; 0x41 = 1011 1110 0xbe,A :0x41 = 0100 0001 ; A 0x41&0x42 = 0100 0000 0x40,A :0x41 = 0100 0001 ; A|B bit: 0|0=0 1|1=1 0|1= 1 1|0=1 B :0x42 = 0100 0010 ; 0x41|0x42 = 0100 0011 0x43,A :0x41 = 0100 0001 ; AB bit: 00=0 11=0 01= 1 10=1 B :0x42
24、= 0100 0010 ; 0x410x42 = 0000 0011 0x03,A :0x41 = 0100 0001 ; 3 = 0000 0010 0000 1000 0x0208,A :0x41 = 0100 0001 ; 3 = 0000 0000 0000 1000 0x08,例:,#include void main() printf(“nrx=%x“,A); printf(“x=%x“,A); printf(“x=%x“,A*2); printf(“x=%x“,(A*2); printf(“ ,练习:设a=12,计算表达式a+=a-=a*12和a+=a-=a*=12的值,3、复合
25、赋值运算符 *=、/=、 %=、 +=、 -=, =, &=、 =、 = 复合运算符是一个运算符,但功能上,是两个运算符功能的组合。,例如: a+=b 相当于 a=a+b a*=b 相当于 a=a*b,注意:a*=b+c 相当于 a=a*(b+c) 而不是 a=a*b+c, 优先级: 与 = 是同一优先级。 结合性:自右至左; 表达式的值:被赋值变量的值。,-264,0, 求值规则: 先求解表达式1的值 若为真(非0),求解表达式2,并把表达式2的值 作为整个条件表达式的值 若为假(0),求解表达式3,并把表达式3的值作 为整个条件表达式的值,四、其它运算符,1、条件运算符 ?和: ,它们与三
26、个操作数组组成三元运算。 形式为: ? :, 优先级: 逻辑条件赋值, 结合性:自右至左;,是Turbo C中唯一的一个3元运算符: A?B:C 优先级很低仅优于赋值=语句,并从右到左结合(即先C、B) 如: ab?a:cd?c:d等价于 ab?cd?a:b:c等价于,又如: 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,ab?a:(cd?c:d);,ab?(cd?a:b):c。,结果的数据类型与B、C
27、中占空间大的为准, 如printf(“rnresult=%f“,0?3.4:2);%f改成%d则不出结果 但在赋值运算中是可以强行转换的: int x;x=4?3.4:2; printf(“rnresult=%d“,x); 结果是3。,2、逗号运算符: , 形式: 表达式1,表达式2,表达式n 求值规则: 从左至右依次计算各表达式的值; 优先级: 最低; 结合性:自左至右; 表达式的值:最后一个表达式的值。,例如: 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,
28、9,4,5,9,5,5,5,5,10, 形式有两种: sizeof 变量名 sizeof (类型名) 结果为整型数。,int a; float x; printf(“%d,%d”,sizeof a,sizeof x); printf(“%d,%d”,sizeof(int),sizeof(float); 以上两个printf语句结果均为 。,例如,3、求字节运算符: sizeof 作用:求得变量或某种数据类型所需的字节数。,2,4, C语言允许整型、实型、字符型数据进行混合运算。 有3种转换方式:自动转换、赋值转换和强制转换。 一、类型自动转换,2.4 数据类型转换,特点:由数值存储位数少的向多
29、的转换;整型向实型转换! 操作数为相同类型的不转换,仍取原类型,特别注意此时可能带来的错误!,int x=2;float y=1.6;char c=A; 则: c + 1/x * y = =,例如,char c=68.5; printf(“%c”,c);,65(int)+ 0(int) * 1.6(float),65(float),二、 赋值转换 在赋值时将赋值符右边值的类型转换成与其左边变量类型一致的类型。,有下列几种情况: (1) 实型 整型(字符型):去掉小数部分;,(2) 整型(字符型) 实型: 补足有效位;,float f=23; 23.00000 f (7位) double f=A; 65.0000000000000 f(15位),例如: 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),三、强制类型转换 形式: (类型名)表达式 强制类型转换时,得到所需类型的中间变量,原来变量的类型不会改变。,2,2.5,2.0,4.4,
链接地址:https://www.31doc.com/p-3423280.html