《C课件第3章数据类型和表达式.ppt》由会员分享,可在线阅读,更多相关《C课件第3章数据类型和表达式.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章 数据类型和表达式本章主要内容本章主要内容数据类型常量变量运算符和表达式函数3.1 数据类型数据类型数据:数据:是程序命令操作的对象数据类型:数据类型:是指将数据根据表达形式的不同而 划分的类别。3C+的数据类型一般分为如下几种:的数据类型一般分为如下几种:基本数据类型基本数据类型非基本数据类非基本数据类型型(用户定义数据类型)整型整型字符型字符型实型(浮点型)实型(浮点型)逻辑型(布尔型)逻辑型(布尔型)数组数组指针指针空类型空类型结构结构联合联合枚举枚举类类数据类型数据类型数据类型修饰符数据类型修饰符4short long unsigned例:无符号整型无符号整型 unsigned
2、int 无符号长整型无符号长整型 unsigned long 无符号短整型无符号短整型 unsigned shortsigned有符号无符号短整形shortshortintsignedshortsignedshort int unsignedshortunsignedshort int 整形intsignedsigned int unsignedunsignedint 长整形longlongintsignedlongsignedlong int unsignedlongunsignedlong int 整型数据分类整型数据分类有符号无符号短整形short-3276832767 unsigned
3、short065535 2字节整形int-2,147,483,6482,147,483,647 unsigned04,294,967,295 4字节长整形long-2,147,483,6482,147,483,647 unsignedlong04,294,967,2954字节整型数据值域整型数据值域数据类型数据类型 常量与变量常量与变量7#includevoid main(void)const int PRICE=30;int num,total;float v,r,h;num=10;total=num*PRICE;couttotal endl;r=2.5;h=3.2;v=3.14159*r*
4、r*h;coutv=Ac=Z)c=c+a-A;将字符变量将字符变量c从大写字母转为小写字母。从大写字母转为小写字母。例例2:0-0=0 1-0=1 2-0=214转义字符转义字符非图形字符非图形字符(如回车、制表符等如回车、制表符等)及及“等字符,因它们有特殊作等字符,因它们有特殊作用,所以表示这些字符本身时。用,所以表示这些字符本身时。P55。如:。如:n 表换行表换行无论是不可显示字符还是一般字符,都可用无论是不可显示字符还是一般字符,都可用8进制数、进制数、16进制数进制数表示表示 ddd:一:一 至三位至三位8进制数。进制数。xhh:一一 至二位至二位16进制数。进制数。例如:例如:0
5、01表示码值为表示码值为(01)8 的的ASCII字符。字符。A也可用也可用101表示表示 0为空白符,即为空白符,即NULL,码值为,码值为0,在,在C语言中是字符串语言中是字符串的结束标志。的结束标志。(与与0和空格符不同和空格符不同)例如:例如:cout“x07operatingtsystemn”;输出:输出:operating system15字符型与整型的关系字符型与整型的关系表达式求值过程中,所有字符被无条件地转换为与其代码等值的整数;如:A+2 的值为 67;可以用类型转换符 int 将一字符强制转换成整数;如:coutint(A);将显示 65可以用类型转换符 char 将一整
6、数强制转换成字符;如:coutchar(67);将显示 C 字符型与整型的关系字符型与整型的关系17例例:int a=b;char c=97;coutaendl;coutcendl;输出:输出:98 an字符数据的使用方法字符数据的使用方法u字符数据和整型数据之字符数据和整型数据之间可以运算。间可以运算。u字符数据与整型数据可字符数据与整型数据可以互相赋值。以互相赋值。字符串常量字符串常量字符串型常量字符串型常量是用双引号括起来的一个或是用双引号括起来的一个或多个字符。多个字符。C+规定以字符规定以字符0作为字符串结束标志。作为字符串结束标志。如,一个字符串如,一个字符串“HELLO”,在内存
7、中以,在内存中以“0”为结尾。为结尾。“0”在输出时不作显示,在输出时不作显示,只用来表示字符串的结束。只用来表示字符串的结束。18字符串型常量字符串型常量“HELLO”H E L L O 0 注意注意“P”与与P不同。前者为字符串,在机内存储形式不同。前者为字符串,在机内存储形式为为 P 0P 0 ,而,而P就是一常数就是一常数P。6565 0字符串常量字符串常量汉字字符及其它全角字符的代码一般用两个字节表示,因此即使是一个汉字也只能表示为字符串,如“汉”(而不能是汉)。注意区分 A 和 A。.符号常量符号常量20define PI 3.14159main()int r;float L,S;
8、r=10;L=2*PI*r;S=PI*r*r;printf(“周长周长=%fn”,L);printf(“面积面积=%fn”,S);这是一个知道圆半径这是一个知道圆半径r,求圆周长,求圆周长L、圆、圆面积面积S的简单的简单C程序。其中的程序。其中的PI就是符就是符号常量,它的值在一开始就被预处理命号常量,它的值在一开始就被预处理命令令“#define”定义为实数定义为实数3.14159了了,故故程序在运行和编译时会自动用程序在运行和编译时会自动用“3.14159”来替代来替代PI。符号常量比起一般常量来,不但使用符号常量比起一般常量来,不但使用方便,实际值容易修改,而且更形象方便,实际值容易修改
9、,而且更形象化,便于记忆。化,便于记忆。符号常量符号常量*C+中:中:const float pi=3.14159;*常量定义中初始化的值可以是一个常量表达常量定义中初始化的值可以是一个常量表达式:式:const int size=100*sizeof(int);const int number=max(15,23);(错)(错)注意:注意:#define 与与const的区别的区别21逻辑常量逻辑常量l布尔型变量的说明:布尔型变量的说明:例:例:bool flag;l布尔型数据的取值:布尔型数据的取值:只有只有 false(0)和)和 true(1)两个值两个值l由于逻辑值是整数由于逻辑值是
10、整数0和和1,所以可以像整数,所以可以像整数一样出现在表达式里,参与各种整数运算。一样出现在表达式里,参与各种整数运算。22枚举枚举型数据型数据基本情况基本情况C+并没有提供枚举类型,而只提供了定义枚据类型的手段;任何枚举类型都需要自己定义。格式:enum 如:enum colorred,yellow,blue;enum DAY Sun,Mon,Tue,Wed,Thu,Fri,Sat;一个枚举类型被定以后,可以像整型等预定义类型一样使用在允许出现数据类型的任何地方。enum color c1,c2,c3;enum day today,workday;c1=red;workday=wed枚举枚举
11、型数据与整型的关系型数据与整型的关系枚举中的一个符号通常对应一个有符号整数,因此其存储空间也等同于一个有符号整数(通常4字节)。一个枚举类型的值域就是枚举符号(如 Sun,Mon 等)所代表的一个整数的子集;0 1 2 3 4 5 6 0 1 2 3 4 5 6枚举枚举型数据与整型的关系型数据与整型的关系一般来说,枚举中的每个符号依次与 0、1、2、3对应,如:enum DAYSun,Mon,Tue,Wed,Thu,Fri,Sat;1 2 5 6 7 1 2 5 6 7枚举枚举型数据与整型的关系型数据与整型的关系也可以任意规定其对应关系,如:enum SomeDigits ONE=1,TWO,
12、FIVE=5,SIX,SEVEN;枚举型数据的功用枚举型数据的功用定义一个枚举类型就是定义了一组相互关联的符号常量,在程序中可用来区分不同的事物或不同的状态;枚举符号的使用可提高程序的可读性、一致性和可维护性。.枚举枚举型数据与整型的关系型数据与整型的关系表达式求值过程中,枚举型数据将被无条件转换成相应的整型数据,例如:SEVEN+2 的值为 9。类别类型修饰符值域有效位字节单精度float 3.410-383.41038 74双精度doubledouble floatlong float 1.710-3081.710308 158长双精度long double 3.410-49323.410
13、4932 1910实型常量实型常量实型常量实型常量定点表示法和浮点表示法325.483.2548e2(3.2548102)不同规格的实型常量 .325.48(double)325.48f 3.2548e2F(float)325.48L 3.2548e2L(long double)实型常量实型常量32(2)一个实型常数缺省说明为double,如表示float型,则 在实数后加 f或 F。例 34.5f 34.5注:(1)指数形式的书写。E或e的前面必须要有数字,且E后面的指数必须为整数。例:e3 .e3 e3.3 变量变量33变量是什么变量是什么变量变量其值允许改变的量,在C+程序中用一个标识符
14、表示,允许通过赋值操作来改变它的值。变量:变量:变量值变量值 23变量名变量名 length 变量类型变量类型 int3.3 变量变量C+规定必须以字母或下划线打头,后面跟字母、数字或下划线(如:a3,Z_5e,_D7d等),并且不能与保留字、函数名、类名等C+专用名相同(如 char,for,int 等)。注意:注意:(a)长度:早期的C编译程序只认前8个字符。VC允许256个字符。但一般不要超过31个字符为宜 1、命名、命名3.3 变量变量35(b)约定:变量名、函数名、和数据类型名等用小写字母 自定义的类型名(如类)、符号常量名及宏 用大写字母;下划线开头的名字常为系统程序(库函数用),
15、用户一般不用。(c)要有意义:如用Sum表示“求和变量”,不要用aaa,A1,B12之类名字。3.3 变量变量36程序中的程序中的num1,num2和和sum都都是变量。它们的值在程序的运是变量。它们的值在程序的运行过程中都发生了变化。变量行过程中都发生了变化。变量定义后,各变量的初值都是不定义后,各变量的初值都是不确定的。确定的。num1的第一个确切的第一个确切值是值是10,当再次给,当再次给num1赋值赋值时,时,num1的值又变成的值又变成-5。其。其他两个变量的变化情况类似。他两个变量的变化情况类似。#includevoid main()int num1,num2,sum;num1=1
16、0;num2=15;sum=2*num1+num2;cout“sum=“sumendl;num1=-5;num2=num1+3;sum=num1+num2;cout“sum=“sumendl;3.3 变量变量2、变量的定义变量的定义37变量:需要定义,说明其存储属性和数据类型变量:需要定义,说明其存储属性和数据类型。存储属性类型区分符变量名赋初值 ;,staticexternregisterautointcharfloatdouble 例:例:static int nward=0,nkayword;同一语句中,不能混合定义不同类型的变量。同一语句中,不能混合定义不同类型的变量。变量的存储类型变
17、量的存储类型lauto存储类(缺省时用)属于一时性存储,其存储空间可以被若干变量多次覆盖使用。lregister存储类存放在通用寄存器中。提高执行的速度。过多使用影响速率。lextern存储类在所有函数和程序段中都可引用。lstatic存储类在内存中是以固定地址存放的,在整个程序运行期间都有效。38变量赋值与初始化变量赋值与初始化(1)double area,radius=23;(2)double area,radius;radius=23;393.4 运算符和表达式运算符和表达式表达式:一个常量或标识对象的标识符是一个最简单的表达式,其值是常量或对象的值一个表达式的值可以用来参与其它操作,即
18、用作其它运算符的操作数,这就形成了更复杂的表达式包含在括号中的表达式仍是一个表达式,其类型和值与未加括号时的表达式相同算术表达式:由算术运算符、操作数和括号构成的表达式称为算术表达式a+b+(c-b)/2+540、双目算术运算符双目算术运算符加(+)、减(-)、乘(*)、除(/)和取余(%)l优先级与结合性:先乘除,后加减,同级自左至右41、双目算术运算符双目算术运算符(1)/除法 5/2=2 5.0/2.0=2.5 若/的两操作数都为整数,则为整除:例 int i=15;float f ;f=i/10;结果为:f=1 如果将第三条语句改为 f=(float)i/10;或f=i/10.0;则结
19、果为:f=1.542、双目算术运算符双目算术运算符(2.)%取余(余的符号与被除数相同,不允许对浮点数操作)3%4=3 4%4=0 例#include void main()int n;n=40%5;cout 40%5:n endl;/(0)n=40%7;cout 40%7:n endl;/(5)n=40%-7;cout 40%-7:n endl;/(5)n=-40%7;cout -40%7:n endl;/(-5)n=-40%-7;cout -40%-7:n endl;/(-5)43注意:当参加运算的两个操作数都是整数时,运算结果也为整数。当参加运算的两个操作数中至少有一个是单精度型,并且另
20、外一个不是双精度型时,运算结果为单精度型。当参加运算的两个操作数中至少有一个是双精度型,则运算结果为双精度型。2.赋值运算符赋值运算符赋值运算符用于将一个数据传给一个变量。例如:int x;x=5;注意:(1)双目运算符,从右到左 d=a=b(2)赋值操作是一个表达式,每个表达式在求值后都有一个确定的值,其值为赋值号左边表达式的值 例:cout(x=5)endl;(3)当赋值号两边类型不一至时,则在赋值前自动把右边表达式的值转换为与左边变量类型相同的值。452.赋值运算符赋值运算符lint a=10;float x=70000.5;x=a;将 a 的值 10 赋给 x,x 的值为 10.0。l
21、int a=10;float x=70000.5;a=x;将 x 的值 70000.5 赋给 a,但 70000.5 超过了 int 的取值范围,于是将超过的部分扔掉了,a 是多少不知道了。特别注意,上面的赋值语句,编译时是可以通过的。46复合的赋值运算符复合的赋值运算符有10种复合运算符:+=,-=,*=,/=,%=,=,&=,=,|=例:a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8)47赋值表达式举例赋值表达式举例a=5表达式值为5a=b=c=5表达式值为5,a,b,c均为5a=5+(c=6)表达式值为11,a为11,c为6a=(b=4)+(c=6)表达式值为10,
22、a为10,b为4,c为6a=(b=10)/(c=2)表达式值为5,a为5,b为10,c为2a-=a+=a*a 相当于:a=a-(a=a+a*a)483.增增1和减和减1运算符运算符l 取作为表达式的值,然后l先;然后取作为表达式的值l 取;l ,取49例:例:int a=3;int a=3;int b=+a;int b=+a;couta couta“bendl;bendl;int c=a+;int c=a+;couta couta“cendl;cendl;445 4例题:x=6;x+=x-=x*x;若x为整型变量,则上述语句执行后 x 的值是()X+与X+1是否相等?+X与X+=1是否相等?4
23、.测类型长度运算符测类型长度运算符-sizeof 操作符操作符语法形式:sizeof(类型名)或 sizeof(表达式)结果值:“类型名”所指定的类型或“表达式”的结果类型所占的字节数。例:sizeof(int)=4sizeof(double)=8sizeof(100)=4sizeof(a)=1sizeof(struct ABC)coutsizeof(double)endl;5.位操作符位操作符位操作符包括:(左移,如:k(右移,如:k2)|(按位或,如:k1|k2)&(按位与,如:k1&k2)(按位异或,如:k1k2)(按位求反,如:k)左移左移1 1位相当于乘位相当于乘2 2,右移,右移1
24、 1位相当于除位相当于除2 25.位操作符位操作符-左移、右移左移、右移左移、右移操作符()移出的被丢弃,移入的是0,如:00000000 00000101 5 00000000 00010100 51 2 有有 1 1 得得 1 1,无,无 1 1 得得 0 05.位操作符位操作符-按位或按位或按位或操作符(|)对应位中至少有一个1,其结果位就是1,否则结果位为0。例如:13|37 4500000000 00001101 1300000000 00100101 3700000000 00101101 45 有有 0 0 得得 0 0,无,无 0 0 得得 1 15.位操作符位操作符-按位与按
25、位与按位与操作符(&)对应位两个都是1,其结果位就是1,否则结果位为0。例如:13&37 500000000 00001101 1300000000 00100101 3700000000 00000101 5 相同得相同得 0 0,不同得,不同得 1 15.位操作符位操作符-按位异或按位异或按位异或操作符()对应位中只有一个1,其结果位就是1,否则结果位为0。例如:13 37 4000000000 00001101 1300000000 00100101 3700000000 00101000 40 1 1 变变 0 0,0 0 变变 1 15.位操作符位操作符-按位求反按位求反按位求反操作
26、符(,一元操作符)对应于1,结果位为0;对应于0,结果位为1。例如:37 6549800000000 00100101 3711111111 11011010 65498 (-38)例题例题假定整数变量x=24(00011000),y=36(00100100).x3=4x=-25x&y=0 xy=60 x44=0001100000101100=00110100=52x&x1=16(优先级别高于&)6.关系运算符关系运算符用关系运算符将两个表达式连接起来,就是关系表达式关系运算是比较简单的一种逻辑运算,优先次序为:=!=优先级相同(高)优先级相同(低)关系表达式是一种最简单的逻辑表达式其结果类型
27、为 bool,值只能为 true 或 false。例如:x=20,y=3.25,ch是一个字符变量 x+=21;y+103&53&510 的值为 false 5=10 的值为 false有假得假,无假得真627.逻辑运算符逻辑运算符-逻辑或逻辑或逻辑或操作符(|)两个操作数至少有一个 true 时,其结果为 true,否则结果为 false;例如:53|53|510 的值为 true 5=10 的值为 false有真得真,无真得假逻辑型数据的应用逻辑型数据的应用等价条件等价条件.基于“否定之否定”!E E基于两种等效的构成相反条件的方法 !(x=y)x!=y !(x=y逻辑型数据的应用逻辑型数
28、据的应用等价条件等价条件基于&或|的交换律 E1&E2 E2&E1 E1|E2 E2|E1基于!对于&或|的分配律!(E1&E2)!E1|!E2!(E1|E2)!E1&!E2逻辑表达式的相反式逻辑表达式的相反式一个逻辑表达式的逻辑非称为这个逻辑表达式的相反式。1.x=52.x3.x=0&y14.x1&x=205.x!=key&flag=true6.chz7.a=b|a=c8.a=x|b2*y+10 x5!xx!0|y=1x20 x=key|flag!=truech=a&ch=za!=b&a!=cax&b=2*y+10习题习题1.p&Pdata!=x2.in&ai!=key3.ch=(|ch=|
29、ch=4.x|i=n|ai=keych!=(&ch!=&ch!=!x&(i=n|i=0)/使用圆括号为必须,因为|的优先级别低于&逻辑型数据的应用逻辑型数据的应用永真条件和永假条件永真条件和永假条件永真条件的例子 true 、y0|y=0 永假条件的例子 false、x15 出现于程序中的这两种条件通常都是逻辑错误,应加以避免。永真条件偶尔用于构造循环结构。注意:注意:n(1)比较运算符与()“”;()“”;n(2)不等于运算符(!)(!)69()逻辑非(!()例!c若,(!c)()!()()若写成从左到右(衡为1)70例题例题ay|ab-!c等价于(ay)|(a y?1:0 后,若x大于y,
30、z的值为1,否则为0。72注意:注意:l注意:l(1)条件运算符优于赋值运算符比关系运算符和算术运算符都低。例 max=(ab)?a:b+1l(2)条件运算符的结合性为“自右向左”l例ab?a:cd?c:d 即 ab?a:(cd?c:d)l(3)条件表达式与一般if的语句的关系 coutb?a:b;l(4)表达式1、2的类型可以不同,条件表达式的最终类型为1和2中较高的类型。739.逗号运算符逗号运算符格式:表达式1,表达式2求解顺序及结果:先求解1,再求解2,最终结果为表达式2的值例 a=3*5,a*4 最终结果为60例2 int a,b,c;d=(a=1,b=a+2,c=b+3);cout
31、dendl;7410.圆括号运算符圆括号运算符圆括号运算符()括号内运算优先进行,即先算括号内,后算括号外。如x/(y+2)75混合运算时数据类型的转换混合运算时数据类型的转换 隐含转换隐含转换一些二元运算符(算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符)要求两个操作数的类型一致。在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(即隐含转换),基本原则是将低类型数据转换为高类型数据。char short int unsigned long float double低 高77混合运算时数据类型的转换混合运算时数据类型的转换隐含转换隐含转换逻辑运算要求
32、参与运算的操作数必须是bool型,如果操作数是其它类型,编译系统会自动将非0数据转换为true,0转换为false。位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,也会自动进行类型转换,赋值运算要求左值与右值的类型相同,若类型不同,编译系统会自动律将右值转换为左值的类型。混合运算时数据类型的转换混合运算时数据类型的转换强制类型转换强制类型转换语法形式:类型说明符(表达式)或(类型说明符)表达式强制类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。注:int a=16,b=5;float x=10;x=(float)a+a/b;3.5 函数函数函数分为系统函数和用
33、户函数两类,这里主要介绍一些常用的系统函数。数学函数(math.h)绝对值abs(x)或fabs(x)、正弦sin(x)、余弦con(x)、正切tan(x)、平方根sqrt(x)、自然指数exp(x)ex e=2.718282、幂pow(x,y)xy、自然对数log(x)lnx、向下取整floor(x)等。如abs(-12)=12、fabs(-3.26)=3.26、sqrt(36)=6、pow(2,5)=32等。803.5 函数函数随机函数(stdlib.h)rand()返回0-32767之间的一个整数;srand(s)让系统建立对应的随机数序列,当自变量s的值不同时,将使系统产生不同的随机数
34、序列。如 rand()%100 得到0-99之间一个随机数for(int i=1;i10;i+)coutrand()%100;终止运行函数(stdlib.h)exit(1)执行时结束程序执行,返回C+主操作界面窗口813.5 函数函数函数调用或称函数调用表达式格式:(),实参表应与函数定义或函数原型中的参数表相对应。例:求指数函数原型 double pow(double x,double y);调用格式:pow(实参1,实参2)pow(3,2),pow(3*2,3),pow(x,y+1)double a=3,b=4,c;c=pow(a,b)-15;82利用ceil函数或者floor函数按要求求
35、取一个数的若干位小数。假定x=3.74265floor(x*100)/100=3.74/保留x的两位小数,x值不变floor(x*10000)/10000=3.7426/保留x的四位小数,x值不变floor(x*1000+0.5)/1000=3.743/保留三位小数,第四位四舍五入floor(x+0.5)=4/对x取整,小数点后1位四舍五入floor(x*10+0.5)/10=3.7/保留x的一位小数,小数点后第2位四舍五入利用随机函数能够产生出任何指定区间内的随机数rand()%100/返回099区间内的一个随机整数10+rand()%90/返回10,99区间内的一个随机整数a+rand()%b/返回a,a+b-1区间内的一个随机整数rand()%100/100.0/返回0.00,0.99区间内的一个随机整数rand()%90/10.0+1/返回1.0,9.9区间内的一个随机整数注意注意在数学算术中省略乘号的地方,在对应的算术表达式中要加上乘号*。在数学算术的分子中若出现加、减运算,或者在分母中若出现加、减、乘和除运算,则表示成算术表达式时应把分子和分母分别加圆括号括起来。对于在三角函数中使用的角度,应转换成弧度,对于使用的常量符号应写成常数3.14159。当算式中带有两个整数相除时,则转换后要使其一写成实数形式,否则将丢失商的小数部分。
限制150内