《C语言-第02章数据类型.ppt》由会员分享,可在线阅读,更多相关《C语言-第02章数据类型.ppt(106页珍藏版)》请在三一办公上搜索。
1、,第二章,数据类型、运算符与表达式,主要内容,2.1 C的数据类型2.2 常量与变量2.3 整型数据2.4 浮点型数据运行2.5 字符型数据,主要内容,2.变量赋初值 2.7 各类数值型数据间的混合运算 2.8 算术运算符和算术表达式 2.9 赋值运算符和赋值表达式 2.10 逗号运算符和逗号表达式,2.1 计算机的工作原理,2.2 C的数据类型,C语言提供了以下一些数据类型。,数据类型,构造类型,指针类型,空类型(无值类型)void,基本类型,数据类型:按被定义变量的性质、表示形式、占据存储空间多少、构造特点来划分的。,2.3 常量与变量,2.3.1标识符,标识符的命名习惯,习惯上,变量名和
2、函数名中的英文字母一般用小写,常量名一般用大写字母,以区分不同意义的标识符。尽量做到“见名知义”。即通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词或缩写作变量名,或汉语拼音字头作变量名。例如:name/xm(姓名)、sex/xb(性别)、salary/gz(工资)等。不要混淆数字和相似的英文字母。如0与O、1与l。例:判断下列标识符的合法性。sum Sum day Date above student_name#33 M.D.John 3days char ab$123,练习:、以下不正确的C语言标识符是()A)ABC B)abc C)a_bc D)ab.c2、以下正确的C语
3、言标识符是()A)%x B)a+b C)a123 D)test!3、不是C语言提供的合法标识符的是()。A)Float B)signed C)Int D)Char4、以下不能定义为用户标识符的是()。Aprintf BVoid C_3com_ DINT,D,C,B,A,2.3.2 常量和符号常量在程序运行过程中,其值不能被改变的量称为常量常量区分为不同的类型:,整型 100,125,-100,0实型 3.14,0.125,-3.789字符型 a,b,2字符串“a”,“ab”,“1232”,注意:单个字符常量用括起来 字符串用“”括起来,符号常量:在语言中,可以用一个标识符来表示一个常量,称之为
4、符号常量。符号常量在使用之前必须先定义,其一般形式为:,#define 标识符 常量值,例2.1 符号常量的使用#define PRICE 30#include void main()int num,total;num=10;total=num*PRICE;printf(total=%dn,total);,说明:程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算,说明:用一个标识符代表一个常量的,称为符号常量,即以标识符形式出现的常量。符号常量的值在其作用域(在本例中为主函数)内不能改变,也不能再被赋值。,说明:如再用赋值
5、语句给PRICE赋值是错误的。PRICE=40;/错误,不能给符号常量赋值,运行结果:total=300,include#define PI 3.14159265 void main()int r;float area;scanf(“%d”,再如:定义符号常量PI代表3.14159265,根据所输入的半径求圆的面积(用变量r放半径的值,用变量area放面积的值)。,2.3.3 变量,变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。变量必须先定义后使用。定义变量的一般格式:,存储类型 数据类型 变量名1,变量名2,变量名3,变量名n;
6、,存储类型 数据类型 变量名1=初值1,变量名2=初值2;,变量初始化的一般格式:,区分变量名和变量值是两个不同的概念,练习:为变量a和b分别赋一个实数,求 a-b 的结果.a+b,#includevoid main()float a,b;scanf(“%f%f”,2.4 整型数据,2.4.1整型常量的表示方法 整型常量即整常数。在语言中,整常数可用以下三种形式表示:(1)十进制整数。如:123,-456,4。(2)八进制整数。以0开头的数是八进制数。如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9.,(3)十六进制整数。以0 x(0X)开头的数是1
7、6进制数。如:0 x123,代表16进制数123,等于十进制数 291.-0 x12,代表16进制数12,等于十进制数-18.,以下选项中可作为C语言合法整数的是 A10110B B0386 C0Xffa Dx2a2,C,注意:这里x,a,b,c,d,e,f是不区分大小写的,(1)整型数据在内存中的存放形式(基于Visual C+6.0编译器)数据在内存中是以二进制补码形式存放的。,2.4.2 整型变量,(2)整型变量的分类:,共六种,有符号基本整型有符号短整型有符号长整型无符号基本整型无符号短整型无符号长整型,(signed)int(signed)short(int)(signed)long
8、(int)unsigned intunsigned short(int)unsigned long(int),注意:括号表示其中的内容是可选的.,表2-1 Visual C+6.0下各类整型数的表示范围,(3)整型变量的定义:变量定义的一般形式为:,类型说明符 变量名标识符1,变量名标识符2,.;,例如:int a,b,c;(a,b,c为整型变量)long x,y;(x,y为长整型变量)unsigned p,q;(p,q为无符号整型变量),例2.2 整型变量的定义与使用#include void main()int a,b,c,d;unsigned u;a=12;b=-24;u=10;c=a+
9、u;d=b+u;printf(“a+u=%d,b+u=%dn”,c,d);,整型数据的溢出例2.3 数据的溢出#include 2 void main()3 4 short a,b;5 a=32767;6 b=a+1;7 printf(%d,%dn,a,b);8,例:以下程序的执行结果是什么?#include void main()short a=-32768,b;b=a-1;printf(“a=%d,b=%d”,a,b);,解题过程:,例:以下程序的执行结果是什么?#include void main()int a=32767,b;b=a+1;printf(“a=%d,b=%d”,a,b);
10、,解题过程:这里都是整型数,int型存储一个数占4个字节,所以直接相加即可。本程序的执行结果为:a=32767,b=32768,【例2.4】不同类型数据间相互赋值。#include void main()short x,y;int a,b,c,d;x=5;y=6;a=7;b=8;c=x+a;d=y+b;printf(c=x+a=%d,d=y+b=%dn,c,d);,2.5 实型数据,2.5.1 实型常量的表示方法,两种表示形式,十进制小数形式e指数形式,0.1233e-3,注意:字母e(或E)前后必须有数字,且e后面的指数必须为整数。,1e3、1.8e-3、-123e-6、-.1e-3e3、2
11、.1e3.5、.e3、e,a E n(a为十进制小 数,n为十进制整数),以下选项中,合法的实型常数是()。A5E2.0 BE-3 C2E0 D1.3E,C,注意:必须有小数点,“规范化的指数形式”,即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。一个实数在用指数形式输出时,是按规范化的指数形式输出的。,例如:123.456可以表示为:123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,0.00123456e5 其中的1.23456e2称为“规范化的指数形式”。,下列变量定义中合法的是 Ashort _a=
12、1.1e-1;Bdouble b=1+5e2.5;Clong if=0 xfdaL;Dfloat 2_and=1e-3;,A,1.实型数据在内存中的存放形式 按指数形式存储。分为小数部分(尾数)、指数部分(阶码)和符号三部分。,2.5.2 实型变量,2.实型变量的分类和定义,例2.5 浮点型数据的舍入误差#include void main()double a,c;/改为float型判断结果 a=123456.789e5;c=a+20;printf(%fn,c);,float,3.实型数据的舍入误差,说明:一个单精度浮点型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表
13、示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数.,【例2.6】浮点数的有效数字。#include void main()float a;double b;a=33333.33333;b=33333.33333333333333;printf(%fn%fn,a,b);,说明:b是双精度型,有效位为16位,但VC+6.0规定小数后最多保留6位,其余部分四舍五入。B输出的都是有效值。,编写:从键盘上输入2个实数给变量a和b,并求其差给变量c的程序。,#include void main()float a,b,c;scanf(“%f%f”,练习:编写:定义2个单精度
14、变量a和b,求其和存入变量sum中;定义2个双精度变量c和d,求其积存入变量tim中,a、b、c、d的值任意给。,#include void main()float a,b,sum;double c,d,tim;scanf(“%f%f%f%f”,编写:从键盘上输入2个实数和2个整数给变量a、b、c和d,分别求ac和bd的结果。,#include void main()float a,b,x,y;int c,d;scanf(“%f%f%d%d”,2.5.3 浮点型常量的类型,C编译系统将浮点型常量作为双精度来处理。例如:f=2.45678*4523.65 系统先把2.45678和4523.65作
15、为双精度数,然后进行相乘的运算,得到的乘积也是一个双精度数。最后取其前7位赋给浮点型变量f。如是在数的后面加字母f或F(如1.65f,654.87F),这样编译系统就会把它们按单精度(32位)处理。,2.6 字符型数据,2.6.1 字符常量 字符常量是用单引号括起来的一个字符。有两种表示形式:(1)用单引号括起来一个直接输入的字符(2)使用转义字符,例,a,A,1abc、“a”,有些以“”开头的特殊字符称为转义字符,【例2.7】转义字符的使用。#include void main()printf(101x36Cn);printf(abctderfn);printf(hijktLbMn);,A字
16、符A B字符a C字符c D非法的常量2以下选项中,合法转义字符的选项是()。A B018 Cxab Dabc3以下选项中,正确的字符常量是()。A”F”B CW D,A,A,C,1.已知大写字母A的ASCII码值是65,小写字母a的ASCII码是97,则用八进制表示的字符常量101是()。,练习 写出下面程序运行结果#include void main()printf(“ab ct derftgn”);printf(“htibbj kn”);,注:r使光标移到本行开头,自此输出的字符(包括空格和跳格所经过的位置)将取代原来屏幕上该位置上显示的字符.,显示屏上的运行结果:f gde j k,字
17、符变量,char ch1,ch2;/定义两个字符型变量ch1、ch2,2.6.3 字符数据在内存中的存储形式及使用方法,每个字符变量被分配一个字节的内存空间。字符值是以其ASCII码的形式再转换为补码形式存放在变量的内存单元之中的。ch1=x;ch2=y;实际上是在ch1,ch2两个单元内存放120和121的二进制代码:,若有说明语句:char s=72;则变量s()。A包含一个字符 B包含两个字符C包含三个字符 D说明不合法,s的值不确定,A,【例2.8】向字符变量赋以整数。#include void main()char ch1,ch2;ch1=120;/给字符变量赋以整数 ch2=121
18、;/给字符变量赋以整数 printf(%c,%cn,ch1,ch2);/以字符形式输出 printf(%d,%dn,ch1,ch2);/以十进制整数形式输出,【例2.9】字符变量与整数进行算术运算。#include void main()char ch1,ch2;ch1=a;ch2=b;ch1=ch1-32;ch2=ch2-32;printf(%c,%cn%d,%dn,ch1,ch2,ch1,ch2);,说明:程序的作用是将两个小写字母a和b转换成大写字母A和B。从代码表中可以看到每一个小写字母比它相应的大写字母的码大。语言允许字符数据与整数直接进行算术运算。,练习:编写将字符A赋予变量a、b
19、赋予变量b,字符5赋予变量c后,显示变量a、b、c的程序。,#include void main()char a,b,c;a=A;b=b;c=5;printf(“%c%c%cn”,a,b,c);,【例2.10】字符变量的符号。,#include void main()char c;c=376;printf(“%dn,c);,C存储形式为,符号位,【例】字符变量的符号。,#include void main()char ch;int x;ch=80+50;x=80+50;printf(ch=%dn,ch);printf(x=%dn,x);,练习:编写输入一个大写字母给变量ch,输出显示该字母及其
20、下一个字母和该字母对应的小写字母的程序。,#include void main()char ch,x,y;scanf(“%c”,字符串常量是一对双引号括起来的字符序列.合法的字符串常量:“How do you do.”,“CHINA”,“a”,“$123.45”可以输出一个字符串,如printf(“How do you do.”);,2.6.4字符串常量,是字符常量,”是字符串常量,二者不同.如:假设被指定为字符变量:char c;,c=a;=“a”;c=“CHINA”;,结论:不能把一个字符串常量赋给一个字符变量。,规定:在每一个字符串常量的结尾加一个“字符串结束标志”,以便系统据此判断字符
21、串是否结束。规定以字符作为字符串结束标志。,如:如果有一个字符串常量”,实际上在内存中是:,它占内存单元不是个字符,而是个字符,最后一个字符为。但在输出时不输出。,以下选项中不能作为C语言合法常量的是A)cd B)0.1e+6 C)“a”D)011,A,2.7 语言的运算符与表达式,用法:变量=表达式作用:将表达式的值赋给变量(常量、变量是表达式的特例)如:a=5 ave=(a+b)/10;,2.7.1 赋值运算符、赋值表达式,一、赋值运算符“=”,注意:与数学中的等式不同,(1)语言允许在定义变量的同时使变量初始化如:int a=3;/指定为整型变量,初值为 float f=3.56;/指定
22、为浮点型变量,初值为.56 char c=a;/指定为字符变量,初值为a,(2)可以使被定义的变量的一部分赋初值。如:int a,b,c=5;表示指定、为整型变量,但只对初始化,c的初值为 如果对几个变量赋以同一个初值,应写成:int a=3,b=3,c=3;表示、的初值都是。不能写成 int a=b=c=3;但可写成:int a,b,c;a=b=c=3;,(3),【例2.11】变量赋值#include void main()int a=3,b,c=5;/a和c进行了初始化 b=a+c;/表达式的值赋给变量b printf(a=%d,b=%d,c=%dn,a,b,c);,以下选项中正确的定义语
23、句是:double a;b;B)double a=b=7;double a=7,b=7;D)double,a,b;,C,赋值表达式,赋值表达式中的“表达式”,又可以是一个赋值表达式.例如:a=(b=5),分析:括弧内的“b=5”是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”相当于执行“b=5”和“ab”两个赋值表达式。赋值运算符按照“自右而左”的结合顺序,因此,“(b5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价.,请分析下面的赋值表达式(a=3*5)=4*3,分析:先执行括弧内的运算,将15赋给a,然后执行4*3的运算,得12,再把12赋给a。最后a的值为1
24、2,整个表达式的值为12。可以看到(a=3*5)出现在赋值运算符的左侧,因此赋值表达式(a=3*5)是左值,注意:在对赋值表达式(a=3*5)求解后,变量a得到值15执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变量a,而不是赋给3*5。,不能写成:a=3*5=4*3,将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中.如:printf(%d,a=b);,分析:如果b的值为3,则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。,赋值结果与类型转换,1.实型数据(包括单、双精度
25、)赋给量整型变量时舍弃实数的小数据部分;2、整型数据赋给单、双精度变量时,便以浮点数形式存储到变量中。,例:,练习:以下程序的结果是:#include void main()int i=010,j=0 x10;printf(“%d%dn”,i,j);,8 16,练习:以下程序的结果是:#include void main()char c=A+10;printf(“c=%cn”,c);,c=K,2.7.2 不同数据类型间的赋值规则,转换的方法有两种:一种是自动转换,一种是强制转换。1、自动转换(1)短长度的数据类型 长长度的数据类型,无符号短长度的数据类型 无符号或有符号长长度的数据类型(低位原
26、样,高位补0),有符号短长度的数据类型 无符号或有符号长长度的数据类型(低位原样,高位符号扩展),(2)长长度的数据类型 短长度的数据类型,直接截取长长度的数据类型的低位部分(长度为短长度的数据类型的长度)作为短长度数据类型的数据,损失精度。,2.强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。一般形式:(类型名)表达式例如:(double)将转换成double类型(int)(x+y)将x+y的值转换成整型(float)(5%3)将5%3的值转换成float型,例2.12强制类型转换。#include void()float;int;=3.6;i=(int);prin
27、tf(x=%f,i=%dn,x,i);,说明:有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。,运行结果:x3.600000,i=3,练习:以下程序的执行结果是:#include void main()float f=13.8;int n;n=(int)f)%3;printf(“n=%dn”,n);,n=1,#include void main()float a,xs;int zs;scanf(“%f”,练习:给变量a任意赋一实数,分别显示其整数部分和小数部分的值.,2.7.3算术运算符和
28、算术表达式,(1)基本的算术运算符:(加法运算符,或正值运算符。如:、)(减法运算符,或负值运算符。如:、)*(乘法运算符。如:*)(除法运算符。如:,注意:如果/两侧都是整数,结果为一整数,如5/2=2;如果/两侧有一个是浮点数,则结果为小数,如5.0/2=2.5)(模运算符,或称求余运算符,两侧必为整型数据,如:的值为)。,(2)算术表达式和运算符的优先级与结合性,语言规定了运算符的优先级和结合性。先算*,/,%,后算+,-规定了各种运算符的结合方向(结合性)算术运算符的结合方向为“自左至右”。,【例2.13】算术运算符“%”和“/”的使用。#include void main()prin
29、tf(nn%d,%d,%d n,20/7,20%7,-20/7);printf(%f,%fn,20.0/7,-20.0/7);,【例2.14】“%”的操作数必为整型。#include void main()printf(%dn,100%3);,练习:编写求2159的商和余数的程序.,#include void main()int a,b;a=215/9;b=215%9;printf(“商是%d,余数是%dn”,a,b);,练习:编写求 a+b 值的程序(a为15,b为8).2(a-b),#include void main()float a=15,b=8;float c;c=(a+b)/(2*
30、(a-b);printf(“c=%fn”,c);,(4)自增、自减运算符 作用是使变量的值增或减如:,在使用之前,先使的值加(减),在使用之后,使的值加(减),i+与+i的区别:是先执行后,再使用的值;是先使用的值后,再执行。例如:假设i的初值为3;i的值先变成4,再赋给,最终i和j的值均为;先将 i的值3赋给,的值为,然后i值加1后变为.最终i的值是4,j的值是3.,i-与-i的区别:-是先执行-后,再使用的值;-是先使用的值后,再执行-。例如:假设i的初值为3-;i的值先变成2,再赋给,i和j的值均为2-;先将 i的值3赋给,的值为,然后i值减1后变为2,注意:(1)自增运算符(),自减运
31、算符(),只能用于变量,而不能用于常量或表达式,(2)和的结合方向是“自右向左”。,【例2.15】自增自减运算符应用。#include void main()int i=8;printf(%dn,+i);/先加后执行输出 printf(%dn,-i);/先减后执行输出 printf(%dn,i+);/先输出后加 printf(%dn,i-);/先输出后减 printf(%dn,-i+);/取负输出再加1 printf(%dn,-i-);/取负输出再减1,写出下列程序的结果:#include void main()int a=100;printf(“%dn”,+a);printf(“%dn”,a
32、+);printf(“%dn”,a);,运行结果:101 101 102,设int a=1,b=2,c,d,e;执行 c=(-a+)+(+b);d=(b-)+(+a)-a;e=(a/(+b)-(b/(-a);后,变量a、b、c、d、e的结果分别是,2 3 2 3 0,解题分析:因为a=1,b=2,执行 c=(-a+)+(+b);c=(-1)+(3)=2 此时a=2,b=3 d=(b-)+(+a)-a;d=(3)+(3)-3=3 此时a=3,b=2 e=(a/(+b)-(b/(-a);e=(3/3)-(3/2)=0 此时a=2 b=3,执行下列语句后,a的值是:int x=4,y=25,z=2;
33、z=(-y/+x)*z-;,7,解题分析:因为x=4,y=25,z=2,z=(-y/+x)*z-;相当于 z=(-y/+x)*z后,再执行z=z-1 所以 z=(24/5)*2=8后,再执行z=z-1=8-1=7,5、算术运算中各类型数据之间的转换规则,10+a+12.3-3.14*x 在C语言中是合法的,【例2.16】不同数据类型进行混和运算。#include void main()float a,b,c;a=7/2;/7/2取整为int型值3,因此a的值/为float型3.0 b=7/2*1.0;/7/2取整为int型值3,再与1.0相/乘,因此b的值为float型3.0 c=1.0*7/
34、2;/先计算1.0*7得double型的结果/7.0,然后将2自动转换为2.0,/再计算7.0/2.0得3.5 printf(a=%f,b=%f,c=%fn,a,b,c);,2.7.4逗号运算符和逗号表达式,例:逗号表达式*5,*,注:赋值运算符的优先级别高于逗号运算符.,的值为5,然后求解*,得。所以最终结果为。,再如:(*,*),a+5,先计算出的值等于,再进行*的运算得60(但值未变,仍为15),再进行得,即整个表达式的值为。,逗号表达式的一般形式可以扩展为 表达式,表达式,表达式,表达式 它的值为表达式的值。,逗号运算符是所有运算符中级别最低的例:(,*),*3,赋值表达式,将一个逗号
35、表达式的值赋给,的值等于,逗号表达式,包括一个赋值表达式和一个算术表达式,的值为,整个逗号表达式的值为18。,功能:是把两个或多个表达式连接起来组成一个表达式,称为逗号表达式。其一般形式为:其值是以表达式n的值作为整个逗号表达式的值。,表达式1,表达式2,表达式n,【例2.16】逗号表达式应用。1#include 2 void main()3 4 int a=2,b=4,c=6,x,y;5 y=(x=a+b),(b+c);6 printf(y=%d,x=%d,y,x);7,假设所有变量均为整型,则表达式(x=2,y=5,y+,x+y)的值是()。A7 B8 C6 D2,B,设以下变量均为int
36、类型,则值不等于7的表达式是()。A(m=n=6,m+n,m+1)B(m=n=6,m+n,n+1)C(m=6,m+1,n=6,m+n)D(m=6,m+1,n=m,n+1),C,2.7.5 sizeof运算符和复合赋值运算符,1、sizeof运算符:sizeof是运算符不是函数名 功能:获取变量和数据类型所占内存大小(字节数)。使用一般格式为:例如:printf(”l=%dn”,sizeof(int));,sizeof 表达式sizeof(数据类型名或表达式),2.复合的赋值运算符 在赋值符“”之前加上其他运算符,可以构成复合的运算符。例如:等价于*等价于*()等价于,以“”为例来说明,它相当于
37、使进行一次自加3的操作。即先使加,再赋给。,为便于记忆,可以这样理解:a+=b(其中a为变量,b为表达式)a+=b(将有下划线的“a+”移到“=”右侧)a=a+b(在“=”左侧补上变量名a),注意:如果是包含若干项的表达式,则相当于它有 括号。如:x%=y+3 x%=(y+3)x=x%(y+3)(不要错写成x=x%y+3),凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。,语言规定可以使用种复合赋值运算符:,*,|,赋值表达式也可以包含复合的赋值运算符。如:a+=a-=a*a,分析:此赋值表达式的求解步骤如下 先进行“*”的运算,它相当于*,a的值为144132。再进行“”的运算,
38、相当于=a+(-132),a的值为132-132-264。,给出以下程序的执行结果:#include void main()int n=2;n+=n-=n*n;printf(“n=%dn”,n);,-4,以下程序的执行结果是#include void main()int i=16,j,x=6,y,z;j=i+1;printf(“j=%dn”,j);x*=i=j;printf(“x=%dn”,x);x=1;y=2;z=3;x+=y+=z;printf(“x=%d y=%dn”,x,y);,j=17x=102x=6 y=5,利用+=,-=,*=,/=,%=完成程序的编写。变量a取2,b取5,c取6,d取10,e取3,f取4时,编写将a加b值赋予a,b减c值赋予b,c乘d值赋予c,de值赋予d,ef 的余数赋予变量e的程序。,#include void main()int a=2,b=5,c=6,d=10,e=3,f=4;a+=b;b-=c;c*=d;d/=e;e%=f;printf(“%d%d%d%d%dn”,a,b,c,d,e);,