《教案数据类型与运算符.ppt》由会员分享,可在线阅读,更多相关《教案数据类型与运算符.ppt(39页珍藏版)》请在三一办公上搜索。
1、C程序设计(第三版)-教学课件,制作人:黄 荧制作人单位:河师大数学与信息科学学院,第三章 数据类型与运算符,本章内容:1 c的数据类型2 常量与变量(变量是重点!)3 整型、实型、字符型变量4 几种常用的运算符(重点,特别赋值运算符),形形色色的数据在程序中如何表示?如何存储?,3.1 C语言的数据类型,C中的数据有4类9种,常用的是其中的3类6种.,注意:1 在计算机中所有数据都是以二进制(补码)形式存储的。2 为使程序能更为高效运行,C将三种基本数据类型(整型、实型、字符型)分为更详细的类型。这样在程序设计时可以尽可能的节约存储空间,加快程序运行的速度。,3.2 常量与变量,一 常量和符
2、号常量常量:(即常数)程序运行时其值不能改变的量 如,12、3.2、a、abc符号常量:用合法标识符代表的常量。即,用一个名字代表的常量。一般形式:#define 标识符 常量如,#define PI 3.1415926优点:含义清楚,灵活机动,易于修改。注意:符号常量通常用大写字母表示。,小资料:标识符:是用来作为变量名、常量名、函数名等 由英文字母、数字、下划线组成的、第一个字符只能是英文字母或下划线的、且不为C关键字的一串字符(关键字P365)。注意:C中的符号对大小写敏感!如,sum与Sum是两个不同的标识符.,例 3.1 符号常量举例 某商品单价为30元,顾客要买10件,编程计算商品
3、的总价格.,#define PRICE 30#include void main()int num,total;num=10;/1)输入数据:num(件数)total=num*PRICE;/2)计算总价:total printf(total=%dn,total);/3)输出总价,二 变量,1 变量的概念:程序运行时其值可以改变的量.2 变量的定义方法:一般形式:类型符 变量名列表如,int n,m,k;/短整型short a;/整型float x,y,z;/单精度实型double t;/双精度实型char c1,c2;/字符型,实验程序:#include void main()printf(各
4、类变量所占字节数为:n);printf(整型 int:%dn,sizeof(int);printf(短整型 short:%dn,sizeof(short);printf(单精度实型 float:%dn,sizeof(float);printf(双精度实型 double:%dn,sizeof(double);,变量定义语句的功能:变量定义语句指挥系统为变量分配存储空间,变量的类型决定了分配存储空间的大小.,3.3 整型数据,整型常量(三种形式)十进制常数 如,123、-12、0八进制常数 由数字07组成,最高位必须用0 做引导符!如,012-(12)8=(10)10、-012 十六进制常数由09
5、和af(AF)组成,最高位必须用0 x(0X)做引导符。如,0 x12-(12)16=(18)10 0 xaf-(af)16=10*16+15=(175)10,实验程序:#include void main()int n=012,m=0 x12;printf(n=(%o)8,(%d)10,(%x)16n,n,n,n);printf(m=(%x)16,(%d)10,(%o)8n,m,m,m);/八进制、十六进制格式符(%o,%x)都是按无符号数输出的,二 整型变量(6种):(根据实际问题的需要选取适当的变量类型)1)有符号整型:int short long(3种,占字节数:2 2 4(Tc)),
6、2)无符号整型:unsigned int 等相应3种(占字节数:2 2 4(Tc)),整型变量:常用的是 int 和 long,二 整型变量(6种):(根据实际问题的需要选取适当的变量类型),实验程序:#include void main()printf(各类整型变量在VC中所占字节数为:n);printf(整型 int:%dn,sizeof(int);printf(短整型 short:%dn,sizeof(short);printf(长整型 long:%dn,sizeof(long);printf(无符号整型 unsigned:%dn,sizeof(unsigned);,原码、反码、补码,计
7、算机中负数的表示,1 原码:将一个整数,转换成二进制,就是其原码。最高位是符号位,0为正,1为负。如:单字节情况下,5的原码为:0000 0101;-5的原码为:1000 0101。2 反码:正数的反码就是其原码;负数的反码是将其原码中,除符号位以外,每一位取反。它也恰好是|x|的所有位取反.如:单字节情况下,5的反码为:0000 0101;-5的反码为:1111 1010。3 补码:正数的补码就是其原码;负数x的反码+1就是补码。它也恰好是|x|每一位取反+1.如:单字节情况下,5的补码为:0000 0101;-5的补码为:1111 1011。4 由负数x的补码求原来的数值:x-1=每一位取
8、反=得到|x|,再加上负号即可。如,x(补)=1000 0000 0000 0000(-1)=0111 1111 1111 1111(取反)=1000 0000 0000 0000=215=|x|所以 x=-215。(当有符号位时,215不能用两个字节的二进制数码表达。两个字节最大能表达215-1。),整型变量易错点-数据的溢出 溢出错误发生原因:给变量的赋值超出相应最大允许值。如:int类型,占2个字节(Tc!注意,vc中short是2个字节,int是4个字节.),因为在内存中:a:0111 1111 1111 1111 32767b:1000 0000 0000 0000-32768的补码
9、,例 3.3 P44 实验程序:变量中所放数据超出最大允许范围会怎样?#include void main()short a,b;/VC中int变量占4个字节。a=32767;b=a+1;printf(%d,%dn,a,b);,运行结果:32767,-32768,整型常量的类型:,1)在一个整数,如果其值在-32768-+32767,则认为它是int型的(Tc)。2)一个整数,如果其值在超出了上述范围,且在-2147485648-+2147485647范围内,则认为它是long型的。(再大就看作实型的了。)3)一个整常量后面加一个字母u,则认为它是unsigned型的。4)一个整常量后面加一个
10、字母l或L,则认为它是long型的。如,0L 占4个字节,3.4 实型数据,实型常量(浮点数)十进制小数形式 如,.123、123.、123.0、0.0、0.、.0、指数形式(常量!一个整体符号)如,3.45e3、3.45E-3(表示:3.45103和 3.4510-3 的值)注意:1)E的前后必须有数字,E后必须是整数。如,.3E3、3E3、3.E3 3E、E3、1E0.3、3Ek(n=3*10k=n=3;i=1;while(i=k)n=n*10;i=i+1;)2)指数形式的输出是按规范化形式输出的:小数部分的小数点前有且仅有一位非零数字。如,3.05e3规范,30.5e2和0.305e4都
11、是不规范的。实型常量的类型:缺省为duoble(占8个字节,有效数字:15-16)!后缀,f、F 为float(占4个字节,有效数字:6-7).如:1.2f 后缀,l、L 为 long duoble(占10个字节,有效数字:18-19)如:1.2L,小资料:有效数字:在这一位上误差不超过这一位的半个单位,则称这一位是有效数字。,二 实型变量(存储方式、分类、易错点等)1 实型数据在计算机中是按照指数形式存放的(如,6.23E-10)如图所示:,2 实型变量的分类(3种),例 3.4 实验程序:变量中所放数据超出有效数位部分会怎样?#include void main()float a,b;a=
12、123456.789e5;b=a+20;printf(%f,%fn,a,b);/%f:格式符,以十进制小数形式输出,默认保留6位小数,实型变量易错点-舍入误差 舍入误差发生原因:在计算过程中有效数位不足。如:float类型有效数字为7位。(Tc!),3.5 字符型数据,一 字符常量 1 用单引号括起来的一个字符:如,a、A、+、9等等。2 转义字符:如,n-代表换行符!(如,printf(*n);),又如,101=A,x41=A,0(串结束符)等.其中(101)8=(41)16=(65)10,3 字符常量在内存中的存储方式:字符常量在内存中是以数值方式存储的!(以ASCII码形式,占一个字节)
13、如,在内存中:,因为字符数据在内存中是以数值方式存储的,所以:1)字符数据是数值类型的数据.2)字符数据可以参加四则运算.3)字符数据可以进行大小比较.4)字符数据可以以数值方式输出.,二 字符型变量(占一个字节)字符变量是用来存放字符的(同样存放的是字符的 ASCII码),且只能存放一个字符!,例 3.6 实验程序:以两种格式输出字符变量的值 验证字符变量中的数据是以ASCII码格式存放的#include void main()char c1,c2;c1=97;c2=a;/a 响铃字符 printf(%c%cn,c1,c2);/以字符格式输出 printf(%d%dn,c1,c2);/以数值
14、格式输出,a 977,例 3.7 小写字母转化为大写字母 验证字符变量是可以进行四则运算的,运行结果:A 65C 67,注意:字符变量和整型变量是不能等同的,#include void main()char c1,c2;c1=a;c2=c;c1=c1-32;c2=c2-32;printf(%c%dn,c1,c1);printf(%c%d n,c2,c2);,三 字符串常量1 字符串常量:字符串常量是用双引号括起来的一串字符。如,welcome、2008、a、welcomenbeijingn 等。2 字符串在内存中的存储方式与结束标记:0如,welcome在内存中:,3 字符串的长度,指的是字符
15、串所包含的实际字符个数,而不是其所占内存的字节数。如,计算下列字符串的长度:1)20082)welcomenbei jingn 3)123328nxafgf,L=4L=17L=10,实验程序:#include#include void main()int n;n=strlen(123328nxafgf);printf(L=%dn,n);,三种常用数据,1)整型:常量:三种形式 变量:常用的 int long 易错:溢出2)实型:常量:两种形式 变量:常用的 float double 易错:舍入误差3)字符型:以ASCII码形式存储!常量:两种字符常量 变量:char,3.6 变量赋初值,在定义
16、变量的同时给它赋初值,称为变量的初始化。,注意:1)绝对不允许:int i=j=k=1;2)允许:int i=2.3;-但是小数部分会被直接裁掉,程序中赋值时也是如此。允许:float x=2,y=a;-转换为实型,将原数值赋给相应变量。,如,int a=3;float f=3.56;char c=a;int i,j,k=1;/这里只给k赋了初值!int i=1,j=1,k=1;/这里才是给i,j,k都赋了初值!,3.7 各类数值型数据之间的混合运算-两个运算量类型不一致的时候,先转化为一致再运算,混合运算示例:,注意:以上的类型转换是由计算机自动完成的。,3.8 几个常用运算符,c运算符总表
17、:1 算术运算符+-/*%(取余)2 关系运算符=(右移)(按位取反)|(按位或)(按位异或)&(按位与)5 赋值运算符=及其扩展赋值运算符(如,+=,*=,-=,)6 条件运算符?:(这是c中唯一的一个三元运算符)7 逗号运算符,(也称为顺序运算符)8 指针运算符*(指针运算符)&(地址运算符)9 求字节数运算符(sizeof)10 强制类型转换运算符(类型名)11 分量运算符.-(也称为结构体成员运算符)12 下标运算符 13 其他 如,函数调用运算符:函数名(),学习运算符需要注意的问题:1)运算符的功能2)运算符的适用范围3)运算符的优先级和结合方向,1 基本算术运算符:+-/*%(取
18、余)注意:1)当分子分母都是整数的时候除法运算符是整除!2)取余运算只适用于整数。,如,3/4=0 1.0/2=0.5 5%2=1 2%5=2,优先级:*/%-+-结合方向:由左到右。,2 强制类型转换运算符(左结合)一般形式:(类型名),例38 强制类型转换运算符的使用#include void main()int i;float x=3.56;i=(int)x%2;printf(x=%.2f,i=%dn,x,i);,运行结果:x=3.56,i=1,如:float x=3.14,y;y=(int)x;注意:强制类型转换只是一种一元运算,如:(int)x得到一个整型的运算结果,但是并不能改变变
19、量x本身的值。,如,i=3;j=i+;printf(i=%d,j=%dn,i,j);,又如,i=3;j=+i;printf(i=%d,j=%dn,i,j);,输出结果为:i=4,j=4,输出结果为:i=4,j=3,3 自增自减运算符:+-(右结合!)i+i=i+1 i-i=i-1,i+:先用值再自加+i:先自加再用值,关于+-运算的说明,#include/实验程序:+-的副作用void main()int i=3,j;printf(%d%dn,+i,+i);/输出:5 4/*1)printf()函数在处理输出项的时候,是按从右向左的顺序先计算输出项的值的,然后再按从左向右的顺序输出。所以输出:
20、5 4*/i=5;j=(+i)+(+i)+(+i);printf(i=%d j=%dn,i,j);/输出:i=8 j=22/*2)VC在处理 a+b+c的时候是按(a+b)+c来处理的。但是同时注意到,当表达式中出现i+时,VC都是在计算完整个表达式的值以后,才对i进行自加,对于函数参数也是如此。i=5:(+i)+(+i)+(+i)=(7+7)+8=22*/*3)i+i从左向右 尽可能多的取字符构成一个运算,所以 i+i(i+)+i*/i=5;printf(%dn,i+i);printf(%dn,i);/输出:10 6/*鉴于+,-容易引起歧义,编程时尽量避免一个表达式中出现多个+或-运算,尽
21、量避免在输出项中出现+或-运算。*/,4 赋值运算符与赋值表达式(右结合!),两种赋值运算符:一般赋值运算符:=复合赋值运算符:+=-=*=/=%=,1)一般的赋值表达式:=赋值运算的运算过程:计算右端表达式的值,赋给左端的变量 左端的变量的值作为赋值表达式的值。如,x=3.4 a=x+2.1 y=(x=1)+2,练习:1 int a,b,c;a=b=c=22 int a,b;float c;a=b=c=2.43 求 a=(b=-2)+(c=12),赋值运算-最重要的运算之一,它具有计算表达式的值的功能!如,r=3.14/4;s=3.14*r*r;v=4.0/3*pi*r*r*r;y=sin(
22、r)/r;,2)复合的赋值运算符:+=-=*=/=%=如:x+=5 x=x+5 x*=5 x=x*5 x%=5 x=x%5特别:y*=x+5 y=y*(x+5),练习:1 int a=2,c;a+=5+(c=3)2 若a=8 求 a/=(b=-2)+(c=12)3 若a=5-注意:在计算过程中变量a的值在不断变化!求a+=a-=a*a4 若a=5 求a+=a-=a*=a计算结果:10 0-40 0,编程计算当a=5时,表达式a+=a-=a*a的值。,实验程序:#include void main()int a=5,b;b=(a+=a-=a*a);printf(b=%dn,b);,5 逗号运算符
23、(顺序求值运算符):(左结合,优先级最低)一般格式:表达式1,表达式2逗号运算的运算过程:依次计算表达式1和表达式2 表达式2作为逗号表达式的值。如,x=(b=2,b+1);逗号表达式的一般形式可以扩展为:表达式1,表达式 2,表达式n,练习:1 表达式 a=3*5,a*4 的值为_。a=?2(a=3*5,a*4),a+5 的值是_。a=?3 1)x=(a=3,6*3)的值是_。x=?2)x=a=3,6*3的值是_。x=?,60201818,4 1)printf(%d%d%d,a,b,c);的含义。2)printf(%d%d%d,(a,b,c),b,c);的含义。,3.8 几个常用运算符,1
24、基本算术运算符+-/*%(取余)2 强制类型转换运算符(类型名)3 自增自减运算符+-(右结合!)i+i=i+14 赋值运算符与赋值表达式(右结合!)1)一般的赋值表达式:=2)复合的赋值运算符:+=-=*=/=%=5 逗号运算符(顺序求值运算符):(左结合),作业:P66,Ex 3.5 3.7 3.9 3.10 3.12,阅读程序:,/题目:输入一个实数,分别输出其整数部分和小数部分。#include void main()float x,f;int r;scanf(%f,阅读程序:,/*输出几个常用类型的变量所占的字节数 函数 sizeof(类型名);返回指定类型的变量所占的字节数 不同的
25、计算机中,同一数据类型占用的空间不一定相同,可用sizeof操作符测试*/#include void main()printf(在VC系统中,各类变量所占字节数为:nn);printf(short-%dn,sizeof(short);printf(int-%dn,sizeof(int);printf(long-%dnn,sizeof(long);printf(unsigned short-%dn,sizeof(unsigned short);printf(unsigned int-%dn,sizeof(unsigned int);printf(unsigned long-%dnn,sizeof
26、(unsigned long);printf(float-%dn,sizeof(float);printf(double-%dn,sizeof(double);printf(long double-%dnn,sizeof(long double);printf(char-%dn,sizeof(char);printf(unsigned char-%dnn,sizeof(unsigned char);,关于不同类型数据之间赋值的说明:赋值的原则是尽量保持所赋的值不变。,一 涉及到实型数据的赋值(1)“实”到“整”,截去小数后,再赋值。(不四舍五入。)如,int i;i=3.999;3=i(2)“
27、整”到“实”,如,float x;x=3;3.000000=x(3)“双精度”到“单精度”,截取7位有效数字后,再赋值。如,duoble d;fload f;d=12.34567890;f=d;12.34567=f 反之与“整”到“实”类似,数值不变,补足有效位后,再赋值。,二 整型数据之间的赋值,首先回顾补码与整型数据的存储方式补码 二进制编码的一种,计算机所用的数据存储方式:整数m的补码:当m=0时,m补码=m原码:除2取余,直至商为0,余数倒序排列。当m 011-(取反)100-(末位加1)101-(符号扩展,补足数位)1111 1111 1111 1101=0XFFFD(2个字节内存中
28、的存储方式,4个字节类似)注意:“符号扩展,补足数位”是为了保证其值仍然是-3.显然如果左边补0所存就变成正值了。1111 1111 1111 1101 最高位是符号位!,整型数据之间的赋值的原则仍是尽量保持所赋数值不变。,4)当左值字节数 int(short 或 long 等为右值时类似)char数据的8位 放到 int数据的最低8位,其余做符号扩展,补足剩余数位。如:char c=376;/376 八进制 内存中:当c看成有符号数据时,,内存中:当c看成无符号数据时,符号实际为正!即,有定义:unsigned char c=376;,5)当左值字节数 右值字节数 时:如,int=char(short 或 long 等为左值时类似)“截断”int数据,仅将int数据的最低8位 原封不动的 放到 char数据的8位。(显然:当“截断”的int数据中有有效数据时就会产生溢出错误!)如:int i=289;,6)int=long 与 4)类似,低位原封不动复制,高位符号扩展,补足剩余数位。反之,long=int 与 5)类似,“截断”高位,低位原封不动复制。7)unsigned int=long,符号实际为正!低位原封不动复制,高位补0.8)当左值字节数=右值字节数 时:如,int=unsigned int 所有位(包括符号位也看成数值位)原封不动复制。,