页数:67页文件大小:386.7 KB来源: C语言程序设计ppt课件
本课件覆盖C语言的数据基础:先说明关键字与标识符规则,再梳理基本类型、构造类型、指针类型与空类型构成的类型体系;随后讲解常量与符号常量、整型数据的补码表示、实型与字符型数据的存储特点,最后归纳各类运算符的优先级与结合性。
第2章 数据类型、运算符与表达式
掌握C的几种基本数据类型;
2.掌握标识符的概念,熟悉变量和符号常量先定义后使用特点;
3.熟练掌握整型长整型、短整型、无符号整型数据和单精度、双精度浮点数的定义与存储特点;
4.熟练掌握字符型数据的的定义与存储特点,并熟悉整型数据与字符型数据间的关系;
5.掌握定义变量的同时,赋初值的方法;
6.掌握不同类型数据间的混合运算规则;
7.掌握不同运算符的使用特点、优先级与结合性;
8.掌握各种表达式的含义与使用要点。
教学要求第2章数据类型、运算符与表达式
2.2 数据类型概述
3常量和符号常量2.4整数类型2.5实数类型2.6字符类型2.7变量及其定义2.8运算符和表达式2.1关键字和标识符结束
2.1 关键字和标识符
什么是关键字已被C语言本身使用,不能作其它用途使用的字,例如不能用作变量名、函数名等。
ANSI C的关键字doubledefaultconstcontinuecharcasebreakautoC89 32个ifgotoforfloatexternenumelsedosizofstaticsignedshortreturnregisterlongintwhilevolatilevoidunsigneduniontypedefswitchstructinline_Bool_Complex_ImaginaryrestrictC99增加的5个
标识符用来标识变量
标识符号合法性判断举例sumSumM.D.Johnstud_namea>b$123_daydaycharDate3dayslotus_1_2#332.1关键字和标识符良好习惯:见名知意!
2.2 数据类型概述
C语言程序中所用到的每一个量(常量、变量及函数等)都是程序的基本操作对象,它们都隐式地或显式地与一种数据类型相联系(属于某种数据类型)。
2.2 数据类型概述C语言
数据类型基本类型指针类型构造类型空类型void字符型char布尔型bool整型(整数类型)实型(浮点型)单精度型float双精度型double长双精度long double数组结构体struct共用体union枚举型enum短整型short整型int长整型long双长整型longlong注:红色是C99所增加的。
2.2 数据类型概述
2.3 常量与符号常量
符号常量
main(){ floatr=10,c,s; c=2*PAI*r; s=PAI*r*r; printf("c=%3.1f\ns=%3.1f",c,s); } 2.3常量与符号常量c=2*3.14*r ; s=3.14*r2; 等价于运行结果:c=62.8s=32.4 整数类型
整型数据分类根据占用内存字节数的不同进行分类:取值范围字节数类型名(关键字)类型-32768~ 32767即-215~ (215-1)2signedshortint短整型有符号4(TC:2)signedint(灰色可省略)基本整型-231~ (231-1)4signedlongint长整型C99新加,VC不支持8signedlonglongint双长整型0 ~ 65535即0~ (216-1)2unsigned shortint短整型无符号4(2)unsignedint基本整型0~ (232-1)4unsigned longint长整型C99新加,VC不支持8unsigned longlongint双长整型取值范围如何得到?
整型常量的三种表示形式
八进制由数字0开头,后跟数字0~7表示。如:0123,011(前加0,与通常含义有别)
动手算一算0123=()10011=()10-0678=()100x123=()100xff=()10-0Xa2b=()102.4整数类型839错误291255-2603
整型常量的类型确定
根据其值所在范围确定其数据类型(short,int,long)如:23456在(-32768~32767)之间,用2字节存放;
45678超(-32768~32767)范围,用4字节存放;
查阅整型数据分类的取值范围可确定其类型。
在Turbo C中,常量后加l或L,认为是long型;
例:30000为int型,12为int型(2字节),65536l为long型,12L为long型(4字节);
在VisualC++中,int和longint都为4字节,没必要用longint类型。
整型数据的内部表示
举例用一字节表示数
(更多字节道理相同)2.4整数类型补码反码原码数值000001110000011100000111+7111110011111100010000111-7000000000000000000000000+0000000001111111110000000-0前提:字节数-1-2…-127-1281111111111111110…100000011000000001…1261270000000000000001…011111100111111110000000 ~01111111[-128~+127]范围解释
负数补码转换成十进制数
(补码的补码)最高位不动,其余位取反加1;
(补码的补码)例:补码11111001取反10000110加110000111(原码)=-73.整型数据在存中用补码存放例:短整型数100和-100在内存中表示(短整型数在VC中占用2个字节内存,其它如基本整型占用4个字节,道理相同。
)2.4整数类型0010011000000000100-1000011100111111111
2.5 实数类型简称实型或浮点型
与整型统称为算术类型。
一、实型数据分类根据占用内存字节数的不同,可分为以下几类:取值范围有效数字占字节数类型名(关键字)类型±(3.4×10-38~ 3.4×1038)6~74float单精度±(1.7×10-308~ 1.7×10308)15~168double双精度±(1.7×10-308~ 1.7×10308)16VC: 8long double长双精度±(1.2×10-4932~1.7×104932)19TC:10
实型常量的表示形式
例如:1.25342e4、12.5342E3、125.342e2都表示实数12534.2说明表示不唯一。
规范的指数形式(谭书定义不一样0.125342e5)小数点左边有一位非0数字,如:1.25342e
实型常量的类型确定
在实型常量后加字母f或F,认为它是float型;如:34.2f为float型;.5F为float型。
加字母l或L,认为它是double型;如:12.56l为double型;2.5E3L为double型
实型常量的舍入误差在内存
中,可以精确的存放一个整数,不会有误差,这是由于整型数值的范围较小;
而实型的数值的范围较大,用有限的存储单元存储,能提供的有效数字总是有限的,因此有效数字以外的数字将被舍去,由此可能产生误差。
如:float类型只有6~7位有效数字123456.1234e5=12345612340.0其中超出有效数字被舍去。
2.5实数类型问题:用程序计算1.0/3*3 = 1?准确不准确
实型数据的内部表示在计算机内部
实型数据的存储当然还是以二进制形式存储,并且以浮点形式存放的。即用以下四个部分表示一个实数
例:实数3.14159在内存
中的存放形式例中用十进制数来示意,实际是用二进制数:实数的值= (数符)二进制尾数×2(阶符)二进制阶码在4个字节(32位)中,各用几位来表示小数和指数,C标准无具体规定,由各C编译系统自定。
2.6 字符类型简称字符型
包含ASCII字符集。
一、字符集与字符代码目前大多数系统采用ASCII字符集,只能使用其中的字符程序才能识别的。
各种字符集的基本集包括了127个字符。
详见《谭书》附录B(ASCII字符表)。
二、字符常量的定义用一对单引号(不是双引号)括起来的单个字符。
例如:'A'、'1'、'+'等。
字符常量的值字符型常量是按整数形式存储
占一个字节,其值是该字符的ASCII码值。(C99把其归为整型类)例如:'A'—65,'a'—97,'0'—48,'\n'—10
C语言允许使用一种“特殊形式”的字符常量,就是以“\”开头的转义字符。(见常用转义字符)
ASCII中一些特殊字符(控制符,如回车等),无法从键盘上直接输入,可以用转义字符的方式表示。
'\101'—'A''\012'—'\n
常用转义字符及含义2.6字符类型含义符号反斜线\\响铃\a水平制表\t垂直制表\v3位8进制数代表的字符\ddd2位16进制数代表的字符\xhh注意区别:0'0' '\0' '
字符串常量用双引号("")括起来
存储每个串尾自动加一个'\0'作为串结束标志例:字符串"China"在内存中□C□h□i□n□a□\0空串""在内存中□\0
字符串常量与字符常量差别'a'与"a"在存储上的差别:'a'-□a,"a"-□a□\0例:charch;ch="a";是错误的!
charch;ch='a';是正确的!
字符串中转义字符的作
main(){ printf("1234567890123456789\n"); printf("abcd\tabcd\b123\n"); printf("1234\t1234\r\\abcd\tab\n"); } 运行结果:2.6字符类型1234567890123456789abcdabcd12341234\abcdab1232.7 变量及其定义
变量的存储
若变量在一个存储单元存不下,则可以使用多个存储单元。当使用多个存储单元时,则第一个存储单元的地址(首地址)就作为变量的地址。
变量的定义
例:inti,j,k;//定义三个整型变量i、j、kfloatx,y;//定义两个实型变量x、ydoublez;//定义一个双精度变量zcharc,e;//定义两个字符变量c、e
变量初始化变量初始化就是在定义变量时
赋初值。
例:inta=2,b,c=4;//b不赋值初值随机floatdata=3.67;charch='A';intx=1,y=1,z=1;intx=y=z=1;(错!)//注意变量定义的语法格式,不要想当然。
变量的使用及定义位置
main(){ inta,b=2; floatdata; a=1; data=(a+b)*1.2; printf("data=%f\n",data); } 2.7变量及其定义先定义,在函数开头;后使用可执行语句2:不正确的变量定义位置
main(){ inta,b=2; a=1; floatdata; data=(a+b)*1.2; printf("data=%f\n",data); }变量的基本操作赋值与引
简单变量
例:floata=123456.789;//a=123456.7doubleb=123456.789;//b=123456.7892.7变量及其定义有效数字
字符型变量
例:整型数据与字符型数据间的关系a='D';x='A'+5;s='!'+'G'4.注意
常变量在定义变量时
如果加上关键字const,则变量值在程序运行期间不能改变,这种变量称为常变量。
C99允许使用常变量,如:constinta=3;注意,在定义常变量时必须同时对它初始化。
常变量与符号常量比较
#definePI3.14//定义符号常量constfloatpi=3.14;//定义常变量
2.8 运算符和表达式
概述1.运算符运算符是在一个数学运算中表示相应运算动作的一种符号。
运算符所作用的对象称作运算分量。
在C语言中,除控制语句和输入输出函数外,其它所有基本操作都作为运算符处理。
TC的运算符非常丰富,主要分为三大类
表达式用运算符和括号将运算对象
(常量、变量和函数等)连接起来的、符合C语言语法规则的式子,称为表达式。例如:1+a*sin(x)/2
单个常量、变量或函数,可以看作是表达式的一种特例,称为简单表达式。如:n、5、sin(x)。
运算符的优先级与结合性
结合性是指当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。
结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。
表达式的计算
如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。
表达式计算的结果
表达式求值的每一步运算都需要进行类型检查,不同类型的数据进行运算时,需要按一组类型转换规则(见下一节)进行处理。
计算结果的溢出
溢出概念:数据类型对计算的限制还表现在数据的范围方面,一种类型的数据有其确定的取值范围,超出一个类型范围之外的数值在这个类型中就没有办法表示,如果书写不当,表达式计算的结果可能超出类型表示的范围。
这种情况叫溢出。
溢出处理:C语言系统对于计算溢出通常不报告错误,计算会进行下去,但计算结果不正确,设计程序时要非常小心。
*:给出程序的执行结果,并分析原因
main()//用整型格式输出a的结果{ shorta=32767+2; printf("%d\n",a); } 程序运行结果:-327672.8运算符和表达式超出短整型数据的取值范围(-32768~32767)01000000000000002的内部形式2.8 运算符和表达式学习
算术运算符和算术表达式
?例2:计算3*7%2+7%2*5*(1/2)的值3*7%2+7%2*5*(1/2)2.8运算符和表达式-2.521-11021100╳-+%/*-(单目)符号减加余除乘取负含义低中高优先级从左向右从右向左结合方向说明两整数相除结果为整数要求%两侧均为整型数据结果为:1
混合运算及数据类型转换
如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。
例:inti
char, short2.8运算符和表达式intdoubledoubledoubleintdoubledouble不同类型的转换方向
数据类型强制转换
例如:(double)a//将变量a的值转换成double型(int)(x+y)//将x+y的结果转换成int型(float)5/2//将5转换成实型,再除以2(=2.5)(float)(5/2)//将5整除2的结果2转换成实型2.
强制转换类型得
到的是一个所需类型的中间量,原表达式类型并不发生变化。
例如:(double)a只是将a的值转换成一个double型的中间量,a的数据类型并未转换成double型。
较高类型向较低类型转换时可能发生精度损失问题。例如:(int)2.1的结果是2,丢失了小数部分。
2.8 运算符和表达式
用法与运算规则前置运算:++i、--i,先增减、后运算。后置运算:i++、i--,先运算、后增减。
2.8 运算符和表达式
*:自增、自减运算符的用法
main(){ intx=3,y,z; printf("x=%d\n",x); z=(x++)+5;} 2.8运算符和表达式运行结果:x=3x=4, y=7x=5, z=9赋值运算符和赋值表达式
例:a=3//将3赋给a,表达式的值为a的值3a=b//表达式的值为b的值a=3+7/2//"+"与"/"优先级高于"="运算符
变量赋初值
对变量可以进行全部或部分初始化inti=1;//定义int型变量i,并初始化成1flatf=0.5;//定义flat型变量f,并初始化成0.5charc='a';//定义char型变量c,并初始化成'a'inta,b,c=5;//定义整型变量a、b、c,初始化c为
在使用变量时
不仅要满足“先定义,后使用”的规定,还要保证在对变量进行取值的操作前变量一定要赋过值。
方法是在定义时进行初始化,也可以先定义变量,后用赋值或输入语句给变量赋初值。
inti=1;//变量初始化是在程序运行时进行的inta=i+1;//可用已定义的变量,对变量赋值
几个变量取同一个初值时,不能采用多重赋值的形式,必需一个一个分开写。inta=b=c=5;//不允许的inta=5,b=5,c=5;//应分开单独写
复合赋值运算
作用简化表达式的写法,并提高编译效率。可把类似:变量名=变量名+表达式简化成:变量名+=表达式
举例a的值为6,计算a+=a-=a+a的值a+=a-=a+a2.8运算符和表达式12a=a-12-6相当于a的值变为-6相当于a=a+(-6)(-6)(6)结果:a =-12注意运算符:
赋值操作中的类型转换
转换规则(a=表达式)系统自动求表达式得的值,按a的类型进行转换;也可用强制转换的方式,人为地转换后赋给变量a;这种转换只限于数值数据之间。
理解和分析赋值类型转换(整型)的过程
赋值的本质是把上一步的结果放到"="左边变量中,结果与"="两边数据类型的长度有关,操作的原则以"="左边的变量类型为准:
若"="右边的数据类型长度比左边的长,则从低位按右边的长度截取部分内容赋值;2.8运算符和表达式低高
"="右边的类型长度不如
类型转换示例例1
设*shorta,b;intd;charc='a'unsignedshorti;floatf=56734.5;a=98304;i=98304;a=98304;i=98304;2.8运算符和表达式98304
2:设*shorta,b;intd;ch
arc='a';unsignedshorti;floatf=56734.5;a=139532;b=-32766;i=b;a=139532b=-32766;i=b2.8运算符和表达式139532
3:设*shorta,b;intd;ch
arc='a';unsignedshorti;floatf=56734.5;i=c;c=0355;a=c;i=c;97(‘a')
c=0355;a=c2.8运算符和表达式符号扩展,以保持值不变97非符号位0355(八进制)
4:设*shorta=-100;intd
逗号运算符(,)和逗号表达式
举例*main(){intx=60,y
printf("x=%d,y=%d\n",x,y); } 2.8运算符和表达式请注意:各种运算符之间的优先级别!y = (x =x-5,x / 5); 1155y = (x =55,11); 5511运行结果:x=55, y=11下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}