版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章高级语言程序
变量和常量及其类型
表达式及运算符
控制结构和函数调用高级语言程序主要教学目标了解C语言发展概述,以及相应的C语言标准规范了解C程序中变量、常量的定义和引用之间的关系理解C程序中变量、常量的类型与机器级表示之间的关系理解编译器对C语言表达式的转换处理任务理解编译器对控制结构语句和函数调用的基本处理任务理解变量的作用域与变量的存储分配之间的关系从C程序的基本要素出发,引出后续各个章节的内容高级语言程序本章内容包括:变量和常量及其类型C程序中的变量及其类型C程序中的常量及其类型表达式及运算符表达式中的运算符C语言中的基本运算控制结构和函数调用C语言中的控制结构语句C语言中的函数调用变量的作用域与存储分配C标准I/O库函数/*---sum.c---*/intsum(inta[],unsignedlen){ int i,sum=0; for (i=0;i<=len–1;i++) sum+=a[i]; returnsum;}/*---main.c---*/intmain(){ inta[1]={100}; intresult;result=sum(a,1);printf(“%d”,result);}常数表达式和运算符变量循环结构语句函数调用标准I/O库函数调用C语言概述本课程基于“IA-32/x86-64+Linux+GCC+C语言”介绍计算机系统基础内容高级语言程序:C语言程序机器级代码:IA-32/x86-64架构操作系统:Linux编译器及开发工具:GCCC语言(起源于贝尔实验室)1970年,肯·汤普森用B语言写了第一个UNIX操作系统1972年,丹尼斯·里奇在B语言基础上设计了C语言1983年,加尼·斯楚士舒普把C语言又扩展成C++C标准:ANSIC(ISOC90)、ISOC99C语言特点简单灵活、抽象程度低(接近硬件)、安全性和规范性较弱C语言中的变量变量的特点表示一个可变化的“值”——必须分配一个存储空间只能有一个唯一的“定义”——所在存储空间的首地址应先定义后引用
——可在表达式中或赋值语句等号左边引用变量的定义必须给出数据类型和名字,必要时给出存储类型(如static)变量定义所在位置和存储类型不同,其作用域和生存期不同编译器根据不同的作用域将变量分配在不同的存储空间中变量的数据类型简单数据类型有无符号整型、带符号整型、浮点类型、指针型C语言标准规定了每种数据类型的最小取值范围复杂数据类型有数组(array)、结构(struct)、联合(union)等关于变量的作用域及所分配存储空间的相关内容参见第6章C语言中的常量三种类型的常量字面量(字面值)#define定义的常量符号
const定义的常量名
常量的定义#define常量:随场景变化,但确定场景下不变(如RADIUS)const常量:任何场景下都不变(如圆周率pi)字面量:可带小数点和字母E、前缀0x、后缀U或u等(如2.85E10、0x12BF、12345、12345U、0x3F8Cu)字面量的处理编译器需将字面量转换为二进制表示形式编译器需根据C语言标准确定字面量的数据类型在不同的C语言标准中,同一字面量数据类型可能不同(见3.2.3)关于不同类型的变量和常量的二进制表示在第3章介绍1#include<stdio.h>2#defineRADIUS20.03intmain(){4constdoublepi=3.14159;5doublecircum=2*pi*RADIUS;6 ……7}C语言中的表达式表达式用于描述对变量和常量的各种组合运算表达式由运算符连接变量和常量而组成
表达式中可嵌套表达式表达式中的运算符与运算算术运算符、按位运算符、逻辑运算符、关系运算符、自增/自减运算符、取地址/取内容运算符以及各种括号等运算符之间有特定的优先级和结合顺序编译器根据运算符优先级和结合顺序对表达式进行处理,生成对应的机器级代码(指令序列)每个表达式对应一个指令执行序列,其中多为运算类指令运算类指令在CPU中执行时,在特定的运算部件中进行运算关于不同类型数据的各类运算方法和运算部件在第4章介绍关于运算类指令将在第5章介绍C语言程序中的运算算术运算(最基本的运算)无符号数、带符号整数、浮点数的+、-、*、/运算等按位运算用途对位串实现“掩码”(mask)操作或相应的其他处理(主要用于对多媒体数据或状态/控制信息进行处理)操作按位或:“|”按位与:“&”按位取反:“~”按位异或:“^”问题:如何从16位采样数据y中提取高位字节,并使低字节为0?可用“&”实现“掩码”操作:y&0xFF00例如,当y=0x2C0B时,得到结果为:0x2C00C语言程序中的运算逻辑运算用途用于关系表达式的运算例如,if(x>y并i<100)then……中的“并”运算操作“‖”表示“OR”运算“&&”表示“AND”运算
例如,if((x>y)&&(i<100))then……“!”表示“NOT”运算与按位运算的差别符号表示不同:&
对
&&
;|对
‖;……运算过程不同:按位对
整体结果类型不同:位串对
逻辑值C语言程序中的运算移位运算用途提取部分信息扩大或缩小数值的2、4、8…倍操作左移::x<<k;右移:x>>kC语言中不区分是逻辑还是算术移位,编译器根据x的类型确定无符号数:逻辑左移、逻辑右移高(低)位移出,低(高)位补0,可能溢出!问题:何时可能发生溢出?如何判断溢出?
若高位移出的是1,则左移时发生溢出带符号整数:算术左移、算术右移左移:高位移出,低位补0。可能溢出!
溢出判断:若移出的位不等于新的符号位,则溢出。右移:低位移出,高位补符,可能发生有效数据丢失。如何从16位数据y中提取高位字节?某字长为8的机器中,x、y和z都是8位无符号整数,已知x=80,则y=x/2=?z=2x=?(y>>8)送8位寄存器移位!y=40?z=160?C语言程序中的运算位扩展和位截断运算用途类型转换时可能需要数据扩展或截断操作C语言中没有专门操作运算符,编译器根据类型转换前后数据的长短,确定是扩展还是截断扩展:短转长
无符号数:0扩展,前面补0带符号整数:符号扩展,前面补符截断:长转短
丢弃高位,可能发生“溢出”例1(扩展操作):在大端机上输出si,usi,i,ui的十进制和十六进制值是什么?shortsi=-32768;unsignedshortusi=si;inti=si;unsingnedui=usi;si=-327688000usi=327688000i=-32768FFFF8000ui=3276800008000例2(截断操作):i和j是否相等?inti=32768;shortsi=(short)i;intj=si;不相等!i=3276800008000si=-327688000j=-32768FFFF8000原因:对i截断时发生了溢出,即:32768截断为16位数时,因其超出16位能表示的最大值,故无法截断为正确的16位数!C语言标准规定,长数转换为短数的结果是未定义的(UB)没有规定编译器必须报错C语言中的控制结构为描述操作执行过程,编程语言会提供一套描述机制,这种机制称为控制结构不同的控制结构描述了程序中相关操作之间不同的执行顺序顺序执行、选择执行、循环执行C语言中的控制结构流程控制语句编译器必须将各类流程控制语句转换为机器级代码关于不同控制结构语句对应的机器级代码在第6章介绍C语言中的函数调用模块化程序设计使用入口参数和返回参数将多个子程序分离C语言中的函数调用实现了程序的模块化设计C语言中的函数调用一个C程序由若干函数组成,从main()函数开始函数之间可以嵌套调用,也可以递归调用函数必须先定义后引用函数的定义和原型声明定义用于构建一个对象,意味着在编译器转换得到的机器级代码中需要为这个对象分配存储空间声明说明存在相应对象,被声明的对象一定存在唯一的定义若声明的对象无定义,则该声明无效,会出现链接错误C语言中的函数调用函数的原型声明函数必须先定义后引用若函数在被引用前未定义,则须先给出其原型声明intadd(intx,inty){ returnx+y;}intmain(){ int t1=125;intt2=80; int sum=add(t1,t2); returnsum;}先定义后引用定义引用C语言中的函数调用函数的原型声明若函数在被引用前未定义,则须先给出其原型声明引用前没有定义的情况下,先声明后使用,被引用的函数定义在其他模块,或在调用(引用)函数之后intbuf[2]={1,2};voidswap();intmain(){swap();return0;}externintbuf[];
int*bufp0=&buf[0];staticint*bufp1;voidswap(){inttemp;bufp1=&buf[1];temp=*bufp0;*bufp0=*bufp1;*bufp1=temp;}原型声明引用定义C语言中的函数调用函数定义函数定义由函数头部和函数体两部分组成函数体中定义的变量为局部变量(有静态局部变量和自动变量)函数头部1constdoublepi=3.14159265;2doublearea_of_circle(doublex)3{4doubleresult;5result=pi*x*x;6returnresult;7}8doublecircum_of_circle(doublex)9{10doubleresult;11result=2*pi*x;12returnresult;13}函数体两个函数体中都定义了局部变量result,不加“static”表示非静态局部变量,即为自动(auto)变量形式参数列表C语言中的函数调用函数调用机制函数调用时,执行流程将从调用函数转到被调用函数转入执行前,入口参数(实参)应传递给形式参数实参必须与形参类型一致或能转换为形参类型数据返回时将返回值传递给调用函数返回参数类型与函数定义类型一致右边例子中存在4次类型转换5.6转换为5后传递给形参r5转换为浮点类型计算2*3.14*r计算结果31.4转换为int型数31将int型数31转换为float型后,再赋给变量x实参intfunct(intr){return2*3.14*r;}intmain(){floatx=funct(5.6);……}形参C语言中的函数调用C程序的执行流程和主函数main()一个完整的C程序中一定有且仅有一个main()函数main()是执行起点,也定义了完整的执行过程。若把函数调用关系用一棵树表示,则main()为树根main()返回类型为int,无“return0;”时自动产生返回值0main()称为主函数,出main()外的函数称为普通函数普通函数可在所定义的文件中被调用,也可在其他文件中被调用编译器会将C语言源程序文件转换为对应平台的机器级代码C语言程序中各种语句(包括函数调用)对应的机器级代码表示将在第5章(IA-32/x86-64指令系统)和第6章(程序的机器级表示)介绍。但是,编译器如何对C语言源程序进行分析处理和代码转换,需要参看编译技术相关教材和资料。函数的作用域和生存期C程序中函数的作用域和生存期一个C程序由多个C语言源程序文件组成一个C源程序文件由一系列外部定义和外部声明构成所有函数的定义都属于外部定义所有外部定义的对象可在整个程序中被引用函数的作用域是整个程序(可被程序中任何函数调用)函数的生存期是整个程序执行过程(可在程序结束前任何时候被调用)每个函数对应的目标代码都会占有存储空间在程序执行过程中,每个函数所占空间的位置不会发生变化,因此,函数代码应分配在静态存储区每个函数对应的代码一定唯一、只读、不可写、可执行变量的作用域及其存储分配C程序变量的作用域和生存期变量的值可变,因此变量需分配存储空间变量的定义本质上是告知编译器需要给变量分配存储空间变量只能有唯一的定义,也即只能有唯一的存储空间编译器根据变量的作用域和生存期进行存储空间分配变量的作用域和生存期与其存储特性(静态、全局、局部)相关变量的引用有读(表达式中)和写(赋值语句等号左边)两种对变量的读和写都是对其存储空间的操作关于不同存储特性变量的存储空间分配,将在第6章(程序的机器级表示)和第7章(程序的链接)介绍变量的作用域及其存储分配C程序中变量的定义全局(外部)、局部全局(外部)变量:定义在所有函数外部的变量局部变量:定义在某个函数体中的变量静态、非静态静态变量:定义中加“static”的变量非静态变量:定义中不加“static”的变量组合形成4种不同的变量非静态全局变量、静态全局变量非静态局部(自动)变量、静态局部变量C程序中外部变量声明若在某函数种需要引用在其他文件中定义的全局变量,则需要在该函数所在的文件中给出加“extern”的外部变量声明全局变量的作用域及其存储分配非静态全局变量简称全局变量,出现在文件中所有函数定义前作用域和生存期同函数的作用域和生存期编译器将其分配在静态存储区,且可读可写静态全局变量作用域仅限所在文件中定义的函数,生存期为整个程序执行过程编译器将其分配在静态存储区,且可读可写只有所在文件的函数可对其进行读写操作不同文件中可定义相同名字的静态全局变量,其作用域不同,被分配在不同的静态存储区静态函数仅在其定义所在文件中被引用,可在不同的文件中定义同名函数局部变量的作用域及其存储分配非静态局部变量简称局部变量或自动变量,在某函数体中定义作用域为其定义所在的最小复合语句函数的形参可看成局部变量,其作用域仅为函数体每次执行函数,局部变量空间都经历“分配-使用-取消”过程编译器将其分配在动态存储区,且可读可写静态局部变量作用域仅在所定义的函数内,生存期为整个程序执行过程编译器将其分配在静态存储区,且可读可写只有定义所在函数可对其进行读写操作不同函数中可定义相同名字的静态局部变量静态全局变量和静态局部变量统称为静态变量(加“static”)C标准I/O库函数用户程序可通过调用特定的I/O函数的方式提出I/O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 谷子驯化进程中根相关微生物组的演变特征与作用机制探究
- 调节性T细胞与IgE:变应性鼻炎发病机制及关联的深度剖析
- 2026年乌鲁木齐市中医院医护人员招聘笔试备考题库及答案详解
- 语篇理解中动允性提取的机制与影响因素探究
- 语文教师专业素养的构成与发展探究
- 语义特征分析理论赋能初中英语词汇教学:实验与探索
- 诊断原料酶GLDH与新型助溶标签的开发及应用探索
- 第10章 工程项目风险管理
- 2026黑龙江省农村义务教育阶段学校特设岗位教师招聘90人笔试模拟试题及答案详解
- 2026年温州瓯海区第三人民医院面向社会招聘临床护士8人笔试参考题库及答案详解
- 凉山州2025年四川凉山州州属事业单位选调工作人员53名笔试历年参考题库典型考点附带答案详解
- 2024北师大版小学三年级数学下册全册教案
- 2026甘肃中考地理考前一周加分卷含答案
- GJB190A-2024《特性分类》标准深度解读
- 工商银行装修工程施工组织设计
- 【《基于多光谱分析的电器设备局部放电诊断方法分析综述》10000字】
- 2025年黑龙江省公务员考试真题及答案解析言语理解
- 2026年高考新高考II卷英语考试试卷及答案
- 教育强国建设三年行动计划(2025-2027年)
- 体外诊断试剂基础知识培训
- 广西三支一扶2026年真题
评论
0/150
提交评论