欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载
     

    C语言程序设计ppt课件 第2章.ppt

    • 资源ID:1375814       资源大小:494KB        全文页数:102页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言程序设计ppt课件 第2章.ppt

    2022/11/16,华中科技大学计算机学院,1,C语言程序设计,The C Programming Language,华中科技大学计算机学院曹计昌,2022/11/16,华中科技大学计算机学院,2,第2章 数据类型、运算符和表达式,C程序是一个字符序列,字符序列先被分解为称之为记号(token)的词法元素,再根据语法规则检查这些记号组合是否合法。 本章首先介绍词法元素和语法规则的概念,然后详尽地讨论组成C程序的基本元素,包括基本数据类型、常量和变量、运算符、表达式等。,2022/11/16,华中科技大学计算机学院,3,2.1 字符及词法元素,2.1.1 字符集C源程序由字符序列构成,其字符集为:1. 英文字母:az 和AZ2. 数字字符:093. 特殊字符:! “ # % & ( ) * + , - . / : ; = ? _ | 4.空白字符:空格、换行符、水平制表符(HT)、 垂直制表符(VT)、换页符(FF),2022/11/16,华中科技大学计算机学院,4,三字符序列,以两个连续问号开头(教材表2-1)。所有的三字符序列都要用相应的单个字符替换,这种替换发生在其他任何处理之前。 例如, int a?(4?)=?;被替换成 int a4=0;,2022/11/16,华中科技大学计算机学院,5,2.1.2 词法元素,词法元素称为记号.记号是程序中具有语义的最基本组成单元记号共分5类: 标识符、关键字、常量、运算符、标点符号.编译器从左至右收集字符,总是尽量建立最长的记号,即使结果并不构成有效的C语言程序。相邻记号可以用空白符或注释语句分开。,2022/11/16,华中科技大学计算机学院,6,词法元素(记号)分析举例,例2.1 sum=x+y 分解成sum、=、x、+和y 共5个记号。例2.2 int a,b=10 ; 分解成int、a、,、b、=、10和 ; 共7个记号例2.3 x+y 分解成x、+、+、+、y 共5个记号,2022/11/16,华中科技大学计算机学院,7,2.2 语法规则生成式-描述语法结构的式子,C的语法规则:由C语言字符集中的单个或多个字符按照确定的规则组成语义上关联的记号,再由记号根据确定的规则构成语句乃至整个程序文本,这些规则被称为C的语法规则。 一个简单的描述语法的式子: := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9用文字叙述:数字可以是字符0,或者字符1,或者字符9。这种描述语法结构的式子被称为生成式。,2022/11/16,华中科技大学计算机学院,8,生成式形式化定义需要提供的4方面信息:,(1) 终结符,C语言字符集中的符号。(2) 非终结符,表示语法单位,在定义中将被利用相应的生成式进一步展开。(3) 生成式规则,每条规则确定一个结构的各个成分,生成式以一个非终结符作为它的左部,而后是符号:=,然后取自终结符和非终结符集合的一个串作为右部。(4) 开始符号,代表语法定义的主结构,任何语法定义过程都从某个非终结符开始。开始符号的生成式总是写在最前面。如: := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9以上4个部分构成了一个语言的文法。而用于描述文法的生成式很多,Backus-Naur(巴科思劳尔)范式(BNF)就是这样的一种生成式,,2022/11/16,华中科技大学计算机学院,9,2.2 语法规则,如何描述计算机语言的语法规则? 2.2.1 BNF (Backus-Naur Form)范式BNF:巴科斯范式是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。,2022/11/16,华中科技大学计算机学院,10,BNF范式的符号,尖括号( )内包含的为必选项。 竖线( | )表示在其左右两边任选一项,相当于“OR”的意思。:= 是“被定义为”的意思。,2022/11/16,华中科技大学计算机学院,11,BNF范式示例,标识符的BNF范式 := | := | := _| := a|b|c|d|z := A|B|C|D|Z := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9,2022/11/16,华中科技大学计算机学院,12,2.2.2 EBNF (略),EBNF是BNF的一种扩充。EBNF中符号有: :括起来的部分重复0次或多次。 :括起来的部分出现0次或1次。( ):表示结成一组。标识符的EBNF范式 : := ,2022/11/16,华中科技大学计算机学院,13,2.2.3 语法图-另一种表示语法的常见方式,语法图是另一种表示文法的常见方式,对应于每个非终结符有一个子图,图中每条路径对应于该非终结符的一个生成式,路径上的是生成式右端的终结符和非终结符。终结符用弧形框表示,非终结符用矩形框表示 标识符的语法图,2022/11/16,华中科技大学计算机学院,14,2.3 标识符、关键字及分隔符,2.3.1 标识符 标识符是用来标识用户定义的常量、变量、数据类型和函数等名字的符号。其命名规则:以一个字母(az, AZ)或下划线( _ )开头,后面可跟字母、下划线或数字(09)例: K,_id , month, time1 20_sum , not#me,2022/11/16,华中科技大学计算机学院,15,注意事项,大小写字母表示不同意义。不能使用类似 int 和 void 这样的C关键字为自己的对象命名,也要避免使用C程序库中函数和常量的名称,例如 scanf 。良好的编程风格是选择有助于记忆且有一定含义的标识符,这样可增强程序的可读性和程序的文档性。,2022/11/16,华中科技大学计算机学院,16,2.3.2 关键字,是被系统赋予特定含义并有专门用途的标识符,不能作为普通标识符,但可以作为宏名。见教材表2.2,2022/11/16,华中科技大学计算机学院,17,2.3.3 分隔符,分隔符统称为空白字符(包括空格符、制表符、换行符、换页符及注释符),在语法上仅起分隔单词的作用。当程序中两个相邻的单词之间如果不用分隔符就不能区分开时则必须加分隔符(通常用空格符)。例如,int x,y;不能写成 intx,y; 能写成 int x , y ;,2022/11/16,华中科技大学计算机学院,18,2.4 基本数据类型,2.4.1 数据类型的分类,2022/11/16,华中科技大学计算机学院,19,2.4.2 基本类型的名字,本小节介绍字符型、整型、浮点型 (表2.4 ),char,int,float,unsigned,signed,short (short , unsigned short ),float,double,long double,long(long , unsigned long ),unsigned,signed,2022/11/16,华中科技大学计算机学院,20,2.4.3 字符类型char,char的存储长度是一字节 。多数系统中char与signed char同(-128127). 字符数据以ASCII码存储在内存中 。在不要求大整数的情况下,可用字符型代替整型 。,2022/11/16,华中科技大学计算机学院,21,2.4.4 整型类型,int型值存储在一个机器字中 .假设字长为2B,int取值范围为-3276832767, unsigned取值范围为0 65535 下面的代码是否正确 #define BIG 30000void main(void) int x,y,z; x=y=BIG; z=x+y; /* 整数溢出 */ ,2022/11/16,华中科技大学计算机学院,22,程序员必须时刻保证整数表达式的值在合理范围内。引入short和long的目的是为了提供各种满足实际要求的不同长度的整数。int通常反映特定机器的自然大小,short一般为2B,long一般为4B。因此,当关心存储时,用short;当需要较大的整数值时,用long。,2022/11/16,华中科技大学计算机学院,23,2.4.5 浮点类型,一个浮点数N可表示为:-10.0=-0.101*24=,符号区1b,指数区8b,尾数区23b,1,00000100,10100 0,2022/11/16,华中科技大学计算机学院,24,尾数所占的位数决定值的精度,指数所占的位数决定值的范围。float占4字节,其中符号1b,指数8b,尾数23b,其精度大约为7位,范围约10-3810+38。double占8字节,其中符号1b,指数11b,尾数52b,其精度大约为15位,范围约为10-30810+308。很多编译器将long double处理为double,在某些系统中,它占用10或12B。很少被使用。,2022/11/16,华中科技大学计算机学院,25,浮点数的表示的近似性,浮点数的表示可能只是近似的。其值与表示法之间的差称为“可表示误差”。计算也可能造成可表示误差。不能使用=和!=运算符比较浮点数据。可以用两个数值之差同一个预定的小正数epsilon比较的方法解决这个问题。如: x=0 可以用 abs(x-0)0.000001表示,2022/11/16,华中科技大学计算机学院,26,浮点数溢出的处理,下溢时,有些系统指数域全为0,尾数域非0,有些系统简单地用0表示。上溢后,用称为“无穷大”的特殊位模式表示,即指数域全为1,尾数域0。有些系统中将输出+Infinity或-Infinity。见p34 图2.4,2022/11/16,华中科技大学计算机学院,27,2.5 常量与变量,2.5.1 文字常量 1. 整型常量有三种表示方法(通过前缀字符区分):十进制:无前缀八进制:前缀为0十六进制:前缀为0 x或0X时。例如,31可写成037,也可写成0 x1f或0X1F,2022/11/16,华中科技大学计算机学院,28,整型常量可以带有后缀,用以指定其类型:,字母u或U表示unsigned字母l或L表示long字母ul或UL表示unsigned long字母ll或LL表示long long (C99)字母ull或ULL表示unsigned long long (C99)无后缀时,表示int当常量值超出指定类型的范围时,其实际类型取决于数值大小、前缀等,确定类型的规则很复杂,在标准化前的C语言、C89和C99中各不相同,2022/11/16,华中科技大学计算机学院,29,2. 浮点型常量,有两种表示方式:(1)带小数点的十进制数形式(可以小数点开头,也可以小数点结尾)如23.7,14.,.126(2)指数形式(科学计数法)将指数部分跟在尾数部分后面。尾数部分的书写规则与第一种相同,但可以没有小数点,指数部分e(E)n,代表10n。如 45e-3 = 4510-3, .15e5 = 0.15105。,2022/11/16,华中科技大学计算机学院,30,浮点类型的后缀,浮点类型可以使用后缀来指定其类型无后缀:表示double,后缀f或F:表示float,后缀l或L:表示long double。,2022/11/16,华中科技大学计算机学院,31,3. 字符常量,(1)用单引号包含的一个字符是字符常量(2)只能包含一个字符,例,a, A, 1abc 、“a”,2022/11/16,华中科技大学计算机学院,32,转义序列,有些以开头的特殊字符称为转义序列转义序列有两种形式,一种是“字符转义序列”,即反斜线后面跟一个图形符号,用于表示字符集中的非图形符号和一些特殊的图形字符。 n 换行 t 水平制表符 反斜杠 单引号“ 双引号 0 空字符 ? 问号,2022/11/16,华中科技大学计算机学院,33,转义序列,转义序列的另一种是“数字转义序列”,即ooo( ooo 表示13个八进制数字)或xhh ( hh表示12个十六进制数字)例如,A、101 和x41 字符A; 11、011、x9和x09 水平制表符HT,2022/11/16,华中科技大学计算机学院,34,4. 字符串常量,写成用一对双引号括住0至多个字符的形式。 stringn /* 包含7个字符的字符串 */ /* 包含0个字符的空字符串*/字符串中的单引号可以用图形符号表示,但双引号和反斜线必须用转义序列表示。例如:340 /* 表示5个字符的字符串:340 */“c:tc” /* 表示4个字符的字符串 */“c:tc” /* 表示5个字符的字符串 */,2022/11/16,华中科技大学计算机学院,35,续行符,如何将一个较长的字符串写成多行?有两种方法:(1)行连接:在前一行的末尾输入续行符() 再换行。Hello,how are you /* 换行后应紧靠行首 */(2)字符串连接:将字符串分段,分段后的每个字符串用双引号括起来。Hello, how are you /* 换行后不必紧靠行首*/,2022/11/16,华中科技大学计算机学院,36,a与 “a”的区别,a与 “a”有何区别 ?a : 字符常量,占1 B内存空间 “a” : 字符串常量,占2B内存空间“a”存储时,系统自动在后面补上0( 空字符,ASC11值为0,作为字符串结束标志)字符串的存储长度比字符串的实际长度大1,2022/11/16,华中科技大学计算机学院,37,2.5.2 符号常量,用一个标识符表示一个常量.C语言中有三种定义符号常量的方法:(1) 用#define指令(2) 用const声明语句(3) 用枚举类型(在2.9节介绍),2022/11/16,华中科技大学计算机学院,38,1用#define定义符号常量,#define是一种编译预处理指令,格式为: #define 标识符 常量,符号常量(一般用大写,以区分变量),2022/11/16,华中科技大学计算机学院,39,例2.5 打印华氏和摄氏温度对照表, 温度转换公式为:=(5/9)(-32),#include #define LOWER 0 /* 表的下限 */#define UPPER 300 /* 表的上限 */#define STEP 20 /* 步长 */void main(void) int fahr; for(fahr=LOWER;fahr=UPPER;fahr=fahr+STEP) printf(%3d:%10.2fn , fahr, (5.0/9)*(fahr-32) );,2022/11/16,华中科技大学计算机学院,40,2用const定义符号常量,const是关键字,称为类型限定符。格式为: const 类型名 标识符=常量;例如: const double PI=3.14159; const int DOWN=0 x5000;/* 下光标键的扫描码 */ const int YES=1,NO=0;,2022/11/16,华中科技大学计算机学院,41,用const和#define定义的符号常量的区别?,const声明的标识符是一个只读变量,编译时系统会根据定义的类型为该标识符分配存储单元,并把对应的常量值放入其中,该值不能再被更改,此后,程序中每次出现该标识符都是对所代表存储单元的访问。#define定义的标识符没有对应的存储单元,只是在编译之前由预处理程序进行简单的文本替换。,2022/11/16,华中科技大学计算机学院,42,2.5.3 变量定义,变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。,2022/11/16,华中科技大学计算机学院,43,变量的声明与初始化,要求对所有用到的变量作定义,也就是“先定义,后使用” 。形式: 类型名 变量表;如:int total,average;变量在声明时可以同时赋一个初值(称为变量的显示初始化),每个变量必须分别显示初始化。如:int count=0,sum=0; char alert=a, c ;int count=0,sum=0;(不能 int count=sum=0;),2022/11/16,华中科技大学计算机学院,44,2.6 运算符和表达式,运算符是运算的符号表示,执行对运算对象(称为操作数)的各种操作。单个的操作数(包括常量、变量和函数调用)是表达式,由运算符和操作数组成的有意义的计算式子便是表达式,如:sqrt(b*b-4*a*c)x=x*PI/180fabs(an)=EPS,2022/11/16,华中科技大学计算机学院,45,2.6.1 C运算符简介,学习每一种运算符都应掌握以下四点:(1)运算符的运算功能 (2)操作数的个数和类型要求 单目(或一元)运算符 双目(或二元)运算符 三目(或三元)运算符 运算符都对操作数的类型有规定,比如%的操作数不能为浮点型。,2022/11/16,华中科技大学计算机学院,46,(3)运算符的优先级和结合性(4)运算所得结果的类型运算的结果是一个具有确定类型的值,这个类型称为表达式值的类型。尤其当两个不同类型的操作数进行运算时,会引起数据类型的转换,特别要注意结果值的类型。,2022/11/16,华中科技大学计算机学院,47,2.6.2 运算符的优先级和结合性,当表达式中包括多个运算符时,C语言会先按优先级规则解释表达式的意义。如: 1+2*3 等价于 1+(2*3)当一个操作数两侧的运算符优先级别相同时,则按“结合性”规则。 1+2-3 等价于(1+2)-3 -从左至右的结合性(左结合),2022/11/16,华中科技大学计算机学院,48,-a+ 等价于-(a+) -从右至左的结合性(右结合)所有运算符的优先级和结合性规则见表2.6 ,必须在学习过程中熟记!,2022/11/16,华中科技大学计算机学院,49,2.6.3 算术运算,运算符:,+ 加法 正值 3+6, +3, 减法 负值 6 4, 5, 乘法 38,/ 除法 8 / 5,% 求余 7 % 4 值为3,2022/11/16,华中科技大学计算机学院,50,注:,两个整型数据相除 (结果为整, 舍去小数部分) 5/ 3 1 1/ 2 0 1. / 2 0. 5 使用时千万注意 int / int 出现数据丢失。, %操作数必需为整数. -11%3 -2 11%(-3) 2,2022/11/16,华中科技大学计算机学院,51,2.6.4 关系运算,有6个关系运算符 : 大于 = 大于等于 小于 = 小于等于 = 等于 != 不等于,2022/11/16,华中科技大学计算机学院,52,关系表达式的类型: int关系表达式的值: 关系成立,值为1(代表“真”) 关系不成立, 0(代表“假”),2022/11/16,华中科技大学计算机学院,53,举例,根据变量说明,给出表达式的值。 int x=4, y=3,z=2; char c=a; (1) c = = A+32 (1) (2) c+1 ! = b (0) (3) x-yy (1) z=xyz (0) xz ?* 要考虑优先级与结合性!,2022/11/16,华中科技大学计算机学院,54,注意,数学上判断x是否在区间a,b中时,习惯写成 a1时为永真式.应写成: ax & xb,2022/11/16,华中科技大学计算机学院,55,常见的C语言编程错误,将运算符= 写成运算符=(赋值)。可能会因为运行时的逻辑错误而导致不正确的结果。例如, if (grade = A) printf(Very Good! ); /*当成绩的等级为A等时,输出Very Good!*/而: if (grade =A) printf(Very Good!); /*不论成绩的等级是几等,总输出Very Good!*/,2022/11/16,华中科技大学计算机学院,56,2.6.5 逻辑运算,有3个逻辑运算符 ! 逻辑非 & 逻辑与 | 逻辑或 逻辑表达式:用逻辑运算符将关系表达式 或逻辑量连接起来的式子,2022/11/16,华中科技大学计算机学院,57,关于逻辑运算,逻辑运算的操作数可以是0和任何非0的数值,系统最终以0判断属于“假”(以0代表“假”), 以非0判断属于“真” (以1代表“真”)。逻辑表达式的值: 1 (“真”) 0 (“假”)逻辑表达式的类型: int,2022/11/16,华中科技大学计算机学院,58,& 和 | 的真值表,2022/11/16,华中科技大学计算机学院,59,! 的真值表,2022/11/16,华中科技大学计算机学院,60,注意,编译程序在处理含有& 、| 表达式时, 往往采用优化算法(提高速度)。 e1&e2 一旦发现e1=0,不再计算 e2 e1 | e2 一旦发现e1=1,不再计算 e2例如, x=0.0 & sqrt(x)=7.7 /* 如果x值为负,不求x的平方根 */,2022/11/16,华中科技大学计算机学院,61,熟练掌握C语言的关系运算符和逻辑运算符后,可以巧妙地表示一个复杂的条件。,(1) 整数a是偶数 !(a%2) 或 a%2= =0 (2)字符c的值是英文字母。 c=a & c=A & c=Z (3)某一年year是闰年。如果某一年的年份能被4整除但不能被100整除,那么这一年就是闰年,此外,能被400整除的年份也是闰年。 !(year%4) & year%100 | !(year%400),2022/11/16,华中科技大学计算机学院,62,2.6.6 自增和自减运算,+:自增,使内存中存储的变量值加1 - :自减,使内存中存储的变量值减1 +和-的奇特之处: 前缀式和后缀式都行 +x x+ 相当于 x=x+1; -x x- 相当于 x=x-1;,2022/11/16,华中科技大学计算机学院,63,注意前缀与后缀的区别,x = 10 ;y = +x ; /* y=11, x=11 */ - 先执行对操作数的加1运算, 再使用该操作数的值y = x+ /* y=10, x=11 */ - 先使用该操作数的值, 再对它作加1运算,,2022/11/16,华中科技大学计算机学院,64,序列点,后缀+(或-)计算延迟的终止点称为序列点。在序列点之前,用原值,序列点之后,该操作数是更改后的新值。下列条件出现序列点:(1) &、|、?: 或 ,运算符,即这些运算符的第一个操作数之后(2) 完整表达式结束时,即表达式语句、return语句中的表达式、if、switch或循环语句中的条件表达式(包括for语句中的每个表达式)之后,2022/11/16,华中科技大学计算机学院,65,举例,int a=1,b=0; (1) b+ + b+ 表达式值为0,b为2 (2) a-&a 表达式值为0,a为0 (3)b+ ? b : -b 表达式值为-1,b为1,2022/11/16,华中科技大学计算机学院,66,几点注意:,1. 只能用于变量(即左值表达式). 如 5+ +, (a+b)- - 均不合法. 2. 结合性为从右至左. 如 i+ 相当于 (i+) 若 i=3, 则该表达式结果为 3, i为4,2022/11/16,华中科技大学计算机学院,67,2.6.7 赋值运算,1. 简单的赋值运算 赋值运算符:= 赋值表达式一般形式为: = 右侧的“表达式”的值赋给左侧的变量 左值 (lvalue) : 赋值运算符左侧的标识符 变量可以作为左值 而表达式就不能作为左值(如a+b) 常量也不能作为左值,2022/11/16,华中科技大学计算机学院,68,赋值表达式的值和类型,与左操作数的值和类型相同 。C把赋值处理为运算符,其好处是使赋值表达式可以像其它任何表达式一样当作一个数据来处理。 如:a=2;b=3; x=a+b; 可以被简化为 : x=(a=2)+(b=3),2022/11/16,华中科技大学计算机学院,69,赋值运算符的结合性,右结合性,如: a=b=c=3; 等价于 a=(b=(c=3);,2022/11/16,华中科技大学计算机学院,70,2. 复合的赋值运算,在“ ”号之前加一个双目运算符:+=, -=,*=,/=,%=含义: E1 OP= E2 E1 = E1 OP E2 如: i+=2 等价于 i=i+2y/=x+10 等价于 y=y / (x+10)x*=k=m+5 等价于 x=x * ( k=m+5)注意:si+=1 和si+ = si+ +1不等价,2022/11/16,华中科技大学计算机学院,71,2.6.8 条件运算,e1 ? e2 : e3,2022/11/16,华中科技大学计算机学院,72,举例,(1) x=10;y=x9?100:200 /* y: 100 */(2)x = a 0 ? 1 : a 0 ? 1 : ( a 0 ? -1 : 0 ),2022/11/16,华中科技大学计算机学院,73,2.6.9 逗号运算,e1,e2计算规则:先计算e1,再计算e2,逗号表达式的值和类型与e2的值和类型相同,2022/11/16,华中科技大学计算机学院,74,举例,(1)x=(i=4,i%3) 表达式的值为:1, x为1(2)x=i=4,i%3 表达式的值为:1, x为4,2022/11/16,华中科技大学计算机学院,75,扩展形式,逗号表达式的一般形式可以扩展为 e,e,e,e 它的值为表达式的值。,2022/11/16,华中科技大学计算机学院,76,注意,并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。 printf(“%d,%d”, 2, 3); /* 输出:2, 3 */ printf(“%d,%d” ,( 2, 3), 3 ); /* 输出:3, 3 */,“(2,3)”是一个逗号表达式,它的值等于3。,“2,3”并不是一个逗号表达式,它是printf函数的2个参数,2022/11/16,华中科技大学计算机学院,77,2.6.10 sizeof运算,一个单目运算符,有两种形式:(1) sizeof(类型名)给出指定数据类型占用的存储字节数 (2) sizeof 表达式 给出表达式结果的类型占用的存储字节数,2022/11/16,华中科技大学计算机学院,78,举例,假设int类型占用2字节。sizeof(long) /* 值为4 */double x; sizeof x /* 值为8 */int a10; sizeof (a) /* 值为20 */int a=1,b=1; sizeof (a+b) /* 值为2, 而sizeof a+b,先求sizeof a,再和b加, 值为3 */,2022/11/16,华中科技大学计算机学院,79,sizeof是一个常量表达式,其运算是在编译时执行的。因此,当sizeof的操作数是表达式时,则在编译时分析表达式以确定类型,运行时不对这个表达式求值。例如:short x=1; sizeof(+x); /* x不递增 ,仍为1 */,2022/11/16,华中科技大学计算机学院,80,2.7 位运算符和位表达式,6个位运算符: (求反) & (按位与) | (按位或) (按位异或,或按位加) (右移),2022/11/16,华中科技大学计算机学院,81,2.7.1 按位求反(),对操作数的每个二进制位取相反值例如: short a=5; unsigned short b=5; a和b的二进制为:00000000 00000101 a的二进制为: 11111111 11111010 a的值为short型 6。 b的值为unsigned short型 65530。,2022/11/16,华中科技大学计算机学院,82,2.7.2 按位与、或、加运算(&,|, ),2022/11/16,华中科技大学计算机学院,83,2.7.3 左移和右移运算( ),en 将e的值向右移n位,而高n位可能填入?。 -e是无符号类型,填入0; -e是有符号类型,一些机器填入0(即“逻辑移位”), 而另一些机器则填入符号位(即“算术移位”)。 在使用右移运算符时应经常用无符号类型。 右移一位相当于该数值除以2,2022/11/16,华中科技大学计算机学院,84,移位运算符的例子,2022/11/16,华中科技大学计算机学院,85,2.7.4 位运算符应用举例,1. 将整数k的低字节作为结果的高字节,整数p的低字节作为结果的低字节,拚成一个新的整数.,p & 0 xff,k 8,|,( ),( ),2022/11/16,华中科技大学计算机学院,86,2.写一个表达式,取一个整数x从第m位开始向右的n位,并使其向右端靠齐。一个整数的各个二进制位从右至左依次编号为第0位、第1位、第2位、。,(1)将要取出的那n位移到最右端 x(m-n+1)(2)设计一个逻辑尺:低n位全为1,其余位全为0 (0(m-n+1) & (0n),2022/11/16,华中科技大学计算机学院,87,3.压缩和解压。 编写一个压缩存储日、月和年的函数,函数的输入参数应该是表示日、月和年的整数,返回压缩后的整数。,分析: 可以把表示21世纪日期的日、月和年3个整数压缩成1个16位的整数,因为日有31个值,月有12个值,年有100个值,所以可以在一个整数中用5b表示日,用4b表示月,用7b表示年.,2022/11/16,华中科技大学计算机学院,88,int pack(int day, int month, int year) month = 7 ; day = 11 ; return(day | month | year) ;请自行编写另一个解压函数。并编写一个测试这两个函数的程序。,2022/11/16,华中科技大学计算机学院,89,4.*简单加密和解密。,将一个短整型数x分成4个长度不等的部分: A(3b)、B(5b)、C(4b)和D(4b),然后将它们按照CADB的顺序重新拼凑在一起,实现对其加密的功能。编写该加密函数。,2022/11/16,华中科技大学计算机学院,90,#define AE 0 xE000 /* 取出A的逻辑尺 */#define BE 0 x1F00 /* 取出B的逻辑尺 */#define CE 0 x00F0 /* 取出C的逻辑尺 */#define DE 0 x000F /* 取出D的逻辑尺 */unsigned short encrypt(unsigned short x) unsigned short a,b,c,d; a=(x,2022/11/16,华中科技大学计算机学院,91,2.7.5 *打印整数各位的软件工具,/* 按位显示 int */ #include void bit_print(int x) int i; int n=sizeof(int) * CHAR_BIT; /* CHAR_BIT 在limits.h中定义 */ int mask = 1 (n-1); /* 逻辑尺mask=1000 */ for ( i=1; i=n; +i ) putchar ( ! ( x ,2022/11/16,华中科技大学计算机学院,92,2.8 类型转换,C语言允许双精度、单精度、整型及字符数据之间混合运算 10 + 1 + 6.5但有一个规则: 先转换成同一类型,再计算。,2022/11/16,华中科技大学计算机学院,93,2.8.1 整数提升,任何表达式中的char、unsigned char、short和unsigned short都要先转换成int或unsigned;如果原始类型的所有值可以用int表示,则转换成int,否则转换成unsigned,把这称为“整数提升”。,2022/11/16,华中科技大学计算机学院,94,2.8.2 一般算术转换,2022/11/16,华中科技大学计算机学院,95,2.8.3 赋值转换,右操作数的值被转换为左操作数的类型 例如: short s=5; double d=2.9; 则 s = d /*把d转换为short,再赋给s。值为2*/ d = s /*把s转换为double,再赋给d。值为5.0*/,2022/11/16,华中科技大学计算机学院,96,2.8.4 强制类型转换,(类型名)操作数 (类型名)操作数是表达式. 例如, (double) i /* 取i值转换成double,i保持不变*/ (long)(a-32) /*a 被自动转换成int, 相减的结果被强制转换为long*/ (float)x+y /*等价于( (float)x)+y*/ (double)x=10 /*错误. Lvalue required in function main*/,2022/11/16,华中科技大学计算机学院,97,2.9 枚举类型,枚举类型是用户自定义类型,它是用标识符命名的整型常量的集合,其中的标识符称为枚举常量。从效果上看,枚举常量是自动设置值的符号常量。,2022/11/16,华中科技大学计算机学院,98,enum week SUN, MON, TUE, WED, THU, FRI, SAT ;,在未指定值的缺省情况下,第一个枚举常量的值为0,以后的值依次递增1 . 可以指定一个或多个枚举常量的值,未指定值的枚举常量的值比前面的值大1 .enum sizes SMALL, MEDIUM=10, BIG , TOO_BIG=20 ; enum 后面也可以不出现枚举名 .enum WIN, LOSE, TIE, ERROR;,关键字,枚举名,枚举常量,1. 枚举类型的定义,2022/11/16,华中科技大学计算机学院,99,2.用枚举类型定义符号常量,#define WIN 0 #define LOSE 1#define TIE 2#define ERROR -1 可用下面的枚举类型定义来代替。 enum WIN, LOSE, TIE, ERROR=-1;,2022/11/16,华中科技大学计算机学院,100,3.枚举变量的说明,(1) 在定义枚举类型的同时说明枚举变量 enum color RED,GREEN,BLUE c1,c2;(2) 利用枚举名来说明枚举变量 enum color RED,GREEN,BLUE c1; enum color c2; 或者 enum color RED,GREEN,BLUE; enum color c1,c2;,一个枚举变量的值是int型整数,但值域仅限于列举出来的范围。枚举变量值的输入和输出都只能是整数。 c1=BLUE; /* 等价于 c1=2; 使用有意义的标识符有助于读者理解程序 */ printf(“%d”,c1); /* 输出2,而不是BLUE */ scanf(“%d”,c2); /* 输入0,不能输入RED */ 下面的语句是错误的: c1=3; /* 变量c1的值域为:0、1和2 */ printf(“%s”, GREEN ); /* 输出错误的结果,而不是GREEN */ if(c1= =RED) printf(“Red” );,2022/11/16,华中科技大学计算机学院,102,第2章习题2.2(1)-(5), 2.3, 2.4, 2.5, 2.6, 2.27, 2.9, 2.11, 2.15, 2.16, 2.17, 2.18, 2.19, 2.21,

    注意事项

    本文(C语言程序设计ppt课件 第2章.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开