版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计课程电子教案TheCProgrammingLanguage第0章C语言程序设计课程安排教材(Textbook)C语言程序设计教程(第二版)秦友淑曹化工编著华中科技大学出版社12月参考书目(ReferenceBooks)(1)THECPROGRAMMINGLANGUAGE,byBrianW.KernighanDennisM.Ritchie,清华大学出版社.PRENTICEHALL(注:该书已有中译本)(2)C语言程序设计典型题解析及自测试题,曹化工秦友淑编著,西北工业大学出版社(3)ExpertCProgrammingbyPetervanderLinden,SunSoftPressISO的C语言标准和相关资料(ISO/IECCStandardandOtherMaterials)(1)最新标准:ISO/IEC9899:1999(E)ISO(theInternationalOrganizationforStandardization)andIEC(theInternationalElectrotechnicalCommission)(2)C始于:”TheCReferenceManual”byDennisM.Ritchie,aversionofwhichwaspublishedinTheCProgrammingLanguagebyBrianW.KernighanandDennisM.Ritchie,Prentice-Hall,Inc.,(1978).CopyrightownedbyAT&T.(3)DennisRitchieHomePage TheDevelopmentoftheCLanguagebyDennisRitchie ANSICstandardlibrary–Wikipedia BrianW_Kernighan n843,n897,n2794等C语言方面的相关标准资料和文档。这些材料届时会放到学校的FTP服务器上,供大家下载、浏览。希望大家有时间可以看一下,从而了解C语言的产生背景、发展过程、发展方向、大师级人物的情况等,以开阔自己的视野,熏陶自己的专业素质。(4)关于C语言的圣经”一书的作者例如:K&RC,即C创始人“TheCProgrammingLanguage”,“C语言的圣经”一书的作者DennisM.RitchiereceivedBachelor'sandadvanceddegreesfromHarvardUniversity,whereasanundergraduateIconcentratedinPhysicsandasagraduatestudentinAppliedMathematics.Thesubjectofmy1968doctoralthesiswassubrecursivehierarchiesoffunctions.BrianW.KernighanisheadoftheComputingStructuresResearchDepartment,BellLaboratories,MurrayHill,NewJersey.
HereceivedaB.A.ScinengineeringphysicsfromtheUniversityofTorontoin1964,andaPh.D.inelectricalengineeringfromPrinceton学时安排(Arrangementofthehouses)讲课:52+4学时实验24hours考核方式:(Examination)闭卷笔试评分:百分制考试成绩70%平时成绩:30%(含实验)(初步意见,要与其他老师商量)学习方法(Studymethods)课前要预习,课堂要专心,课后要复习通过预习、听课、复习、以及作业和实验,确保消化课堂和教材的相关内容。要学会自己看书、理解,逐步减少对老师的依赖,培养良好的自学能力。同时,由于学时紧张,“五.一”长假的冲击,讲课速度会逐步加快到一个合适的水平,以保证教学计划的完成,因此课前课后一定研读教材。认真、独立的完成作业。要重视实验。上机实验前要求预先编好有关程序,把上机的重点放到程序的编辑、修改、编译、链接、跟踪、调试程序方面来。放到观察程序运行过程中的中间结果和运行完毕后的运行结果方面来。最终使自己的大脑变成一台“计算机”,能够在脑袋中运行自己的程序,判断各种情况下程序的走向等等。7.定位问题(Orientation) 国际一流大学是踏踏实实干出来的,是一代又一代师生勤奋学习,刻苦钻研的结果。华工计算机专业培养的学生应该是将来能够与MicroSoft的程序员,软件大师们一争高下的人才,应该是有朝一日能够根据实际应用需求,发明创造新型计算机程序设计语言的人才。因此要高标准、严要求。不仅要掌握C的语法、语义,学好用好C;而且要了解各种语言成分产生、流传、延续、发展的深层次原因和需求背景。为学习后续课程,为将来能够熟练的用C写系统软件、底层软件、共享软件奠定坚实的语言基础。8.欢迎就教学方法,讲课速度,教学内容的深度和广度提出好的建议和意见,以便把本门课程的教学组织实施好。附:实验安排序号实验题目备注1TurboC2.0集成开发环境及简单程序设计2基本数据类型和运算程序设计3流程控制程序设计4C函数程序设计5数组程序设计6指针程序设计7函数、数组、指针及其应用程序设计8结构与联合程序设计9文件I/O程序设计引论(Introduction)1.1基础知识(Basicknowledge)1计算机系统(Computersystem)1.硬件(hardware): 计算机主机、外设(peripheralequipment)pp1-2 CPU、内存、I/O设备、外存重点:内存中的二进制位、字节、字、内存单元的地址。位(bit)用于存放一位二进制信息。即:0或1字节(byte)1byte=8bit字(word)16位机:1word=2byte32位机:1word=4byte地址:内存单元的编号。对于一般通用型计算机:内存是按字节线性编址。11001011…011011100000H0001H0002H0003H0004HbyteFFFDHFFFEHFFFFHbit2.计算机软件(computersoftware)p3自学1.1.2算法及其表示(arithmetic/algorithm)1.算法的基本特性P3算法:计算机为了解决某一问题所使用的方法和步骤。算法的基本特性:有穷性:仅包含有限步,执行有限步后必须终止。确定性:每一步规定的动作唯一,不得有语义方面的二义性。有I/OI:输入信息,O:输出结果。有效性:每一步规定的动作能够有效的执行。2.算法的表示解释P4流程图符号3.算法表示举例P5计算:s=1+2+3+…+100voidmain(void){ intk,s=0;for(k=1;k<=100;k++) s=s+k;printf(“thesumis%d”,s);}1.1.3程序设计及程序设计语言PP5-6自学1.2C语言产生的发展(ThedevelopmentofClanguage)背景(Background):早期由汇编语言编写的操作系统等系统软件,由于汇编语言依赖于机器硬件而可读性、可移植性(从一种型号的机器转到另外一种型号的机器)差。需求(Requirement):寻求一种可读性好、通用性强,并且又象汇编语言一样能够对机器硬件直接进行操作的计算机语言。即要求:该语言既具有一般高级语言的特性,同时又具备汇编语言(低级语言)特点的计算机程序设计语言。这是C语言产生的客观需求。年代方面剑桥大学CPL(CombinedProgrammingLanguage)语言。特点:较ALGOL60对机器硬件更接近。1967年 MatinRichards(剑桥大学)BCPL(BasicCombinedProgrammingLanguage)语言。它是简化的CPL。1970年 KenThumpson(贝尔实验室) 以BCPL为基础B语言。有简单数据类型,接近计算机硬件。1972-1973D.M.Ritchie基于B语言C语言1973 K.Thumpson和D.M.Ritchie 将90%UNIX代码用C写,产生了UNIX51977产生不依赖于机器硬件的C编译器1983ANSI制定了关于C的标准:称为ANSIC198787ANSIC1990ISO制定了C语言标准。标志C以及走向成熟1999.12发布:ISO/IEC9899:1999(E)是到目前为止的最新C语言标准。技术层面方面C语言产生前计算机界面临的问题和挑战,C语言产生的技术背景,某些语言成分产生的理由和根据可以参阅:see:TheDevelopmentoftheCLanguagebyDennisRitchie另外:1983.7出现C++。引入了类这种抽象数据类型,导致封装、继承、多态性等面向对象程序设计核心概念和技术的产生。1987年后,C++编译器已经比较稳定,成为面向对象程序设计的主要工具。OOP—ObjectOrientedProgramming面向对象程序设计1998年 发表到目前为止最新C++标准:ISO/IEC14882:1998(E)计算机学科发展方面ACM与IEEE联合于12月推出的计算机学科教学计划2001(ComputingCurricula2001)2.中国计算机科学与技术学科教程2002(CCC2002)在计算机语言方面强调程序设计语言范型。3.程序设计语言范型概述范型一词源于英文中paradigm,也有范例之意。程序设计语言范型指程序设计语言的语言特征,主要涉及到与程序设计语言相关的程序设计方法和组织程序的方式。从国外教科书中关于程序设计语言范型的处理和解释来看,一般是从不同程序设计语言相互比较的角度来讨论程序设计语言范型。就某一特定的程序设计语言而言,范型的讨论则归结为与程序设计技术和程序设计风格相关的程序设计范型[7]。从程序设计语言范型分类的角度看,程序设计语言可以分为:命令型语言(ImperativeLanguage)功能型语言(FunctionalLanguage)面向对象程序设计语言(Object-OrientalProgrammingLanguage)以及逻辑型程序设计语言(LogicProgrammingLanguage)。在目前流行的十种程序设计语言中:FORTRAN、C、Pascal属于命令型语言。LISP、ML属于功能型语言。Ada、Smalltalk、C++、Java属于面向对象程序设计语言。Prolog属于逻辑型程序设计语言。1.2.31.3C程序的基本结构(ThebasicstructureofaCprogram)例1.1#include"stdio.h"/*#include是编译预处理命令,stdio.h是头文件*/voidmain(void){ printf("StudyingCisveryinteresting!\n");}运行结果:StudyingCisveryinteresting!程序解释:一个C程序由一个main函数,零个或若干个其它函数组成。程序的运行从main函数开始,其它函数由mian函数或另外函数调用执行。由/*和*/界定的文字是程序的注释部分,使用注释是为了增加程序的可读性。编译程序忽略注释,不对它进行编译。#include是编译预处理命令,stdio.h是头文件main是主函数的函数名。voidmain(void)称为函数的头部。头部的一般形式是:返回值类型函数名(形参表)因此,第一个void表示函数无返回值,第二个void表示函数无形参。由一对花括号{ 语句序列}界定的部分称为函数体。函数体中有若干个语句构成的语句序列。一般包括:说明语句序列和可执行语句序列 本例中无说明部分,只有printf语句。printf("StudyingCisveryinteresting!\n");称为C的一个语句C语句的一般形式是: 表达式;表达式又是由一些名字(单词,词法记号)和一些操作符组成。分号作为语句的结束标志。printf("StudyingCisveryinteresting!\n")是一个函数调用表达式。它调用系统提供的打印输出函数向标准的输出设备(CRT)输出一个文字序列。例1.2在两个数中找出较大者并加以输出。#include"stdio.h"voidmain(void){ inta,b,c;/*说明语句,声明变量a,b,c都是整型变量*/ scanf("%d%d",&a,&b);/*从键盘送两个数给变量a,b。*//*"%d%d"为格式字符串,&a取a的地址,&b类似*/ c=b;/*先假设b较大*/ if(a>b)c=a;/*如果a较大,将a值赋给c*/ printf("max=%d\n",c); /*输出较大者*/}输入:1020输出:max=20例1.3修改例1.2将其中找较大数的任务定义成一个函数。#include"stdio.h"intmax(intx,inty){ intz=y; if(x>y)z=x; returnz;}voidmain(void){ inta,b,c; scanf("%d%d",&a,&b); c=max(a,b); printf("max=%d\n",c); }程序由两个函数组成。main函数先从键盘接受两个数据并赋给变量a,b,再向max函数提供两个数(实参),这两个数传递到max函数的形参x,y中,再由max函数进行判断,将较大者返回。返回值作为函数调用的结果赋给变量c。最后输出结果。C程序基本结构小结:l)C程序的组成(theorganizationofaCprogram)一个C程序可以由若干个函数构成,其中必须有且只能有一个以main命名的主函数,但可以没有其他函数。每个函数完成一定的功能,参数是被函数处理的数据,参数能够在函数与函数之间传递数据。main函数可以位于源程序文件中的任何位置,但程序的运行总是从main函数的第一个可执行语句开始的,当遇到一个函数调用时,执行的控制转人被调用函数;从被调用函数返回到调用函数后继续执行调用点之后的代码。2)函数的组成(thefunctionstructure)函数是一个独立的程序块,相互不能嵌套。main函数以外的其他任何函数只能由main函数或其他函数调用,自己不能单独运行。一个函数由两部分组成:函数头部和函数体。函数头部包括函数返回值的类型、函数名和参数表,函数头部的末尾不能加分号(;)。参数表可以为空,参数表为空时用类型名void表示(void可以缺省)。函数体包括说明部分(局部说明)和语句部分;可以没有说明部分,也可以没有语句部分。说明部分和语句部分都为空的函数称为哑函数,例如intmax(intx,tilty){},max是一个哑函数。哑函数是一个最小合法函数,调用一个哑函数在功能_!几不执行任何操作,但在调试由多个函数组成的大程序方面很有用处。3)C标准函数(Cstandardlibraryfunction)c函数分为两类:标准函数和用户自定义函数。用户自定义函数是由程序员在自己的源程序中编写的函数,例如程序1.3中的max函数。标准函数是由c编译程序提供的一些通用函数,这些函数以编译后的目标代码形式集中存放在称为C标准函数库的文件中,c标准函数又称为c库函数。例如,scanf和printf函数都是C:标准函数(或C库函数)。用户程序需要使用标准函数时,只需在使用前用#include包含该标准函数所需的系统头文件,例如scanf和printf函数的头文件为stdio.h,然后按规定的格式调用所需标准函数即可。系统头文件中包含了相应标准函数的说明(函数原型)、有关的类型定义及常量定义等。4)书写格式(writingformat)书写C程序时,一个语句可以写成多行,但不能在一个单词(1-4节)内部换行;也可以在一行上写多个语句,但最好一行只写一个语句(有利于程序调试)。为使程序层次清晰、美观,易于阅读(即可读性好),易于在调试程序时检查错误,对具有嵌套结构的语句应写成层层缩进对齐的格式。即将处于同一层次的语句在列上对齐,处于下一层次的语句用制表符(按Tab键)使其向右缩进相同的空白。此外,程序中还应加必要的注释(英文或汉字均可),这对程序员自己可起备忘录的作用,对他人则起帮助理解程序功能和算法的作用。必要的注释是提高程序可读性的又一有效措施,也是良好的程序设计风格的一种体现。1.4C任何一种程序设计语言都有自己的一套语法规则以及由基本符号按照语法规则构成的各种语法成分:例如,常量、变量、表达式、语句和函数等。基本语法单位是指具有一定语法意义的最小语法成分。c语言的基本语法单位被称为单词,单词是编译程序的词法分析单位。组成单词的基本符号是字符,标准c及大多数c编译程序使用的字符集是ASCII字符集〔附录A〕。C语言的单词(token)分为六类:标识符(identifier)关键字(keywords)常量(constants)字符串(string)运算符(operators)分隔符(listseparator/separator)1.4.1标识符(identifier)标识符的含义在c语言中,标识符的含义是指用户定义的常量、变量、数据类型和函数的名字。其中main是唯一由编译程序预定义的名字,被规定为主函数的函数名。Identifier—TheANSICstandardcallsthenamesofvariables,functions,labels,andvariousotheruser-definedobjectsidentifier.标识符的组成规则由字母或下划线开头,后跟字母、数字或下划线。Thefirstcharactermustbealetteroranunderscoreandsubsequentcharactersmustbeeitherletters,numbers,orunderscores.另外,C语言是对大小写敏感的语言(Cisakindofcasesensitivecomputerlanguage.)。即C语言区分大小写。字母相同但大小写不同的标识符是不同的标识符。例如:sum,Sum,SUM是三个不同的标识符。a1b2c3,_123,book1都是合法的标识符。3abc,abc.txt,sub-sys都是非法标识符。(其余见P13)1.4.2关键字(keywords)关键字是系统预定义的名字。它用于表示C语言的语句、数据类型、存储类型或运算符。用户不能用它们来作为自己定义的常量、变量、数据类型或函数的名字。关键字又称为保留字,即被系统保留作为专门用途的名字。标准c定义的32个关键字 见P131.4.3分隔符(separator)分隔符又称为空白字符(white-spacecharacter),包括空格符、制表符、换行符、换页符及注释符。作用:空白字符在语法上仅起分隔单词的作用。程序中两个相邻的标识符、关键字和常量之间必须用分隔符隔开(通常用空格符)。否则将被视为单个单词。1.5运行C程序的一般步骤解释:P14作业:pp15-162,1.4,1.5,1.7,1.8,1.9,1.102.1基本数据类型()数据是程序处理的对象。数据的值的范围是由数据的存储长度(即存储单元字节数)决定的。为了数据存储和处理的需要,编译程序将数据划分为不同的类型,并为每一种类型规定了该类型数据在内存的存储单元字节数(称为类型的长度或类型的大小)和对该类型数据所能进行的运算。数据类型的值域:由于数据类型的长度总是有限的,所以任何一种类型的数据其值均被限制在一定的范围,称为数据类型的值域。数据类型:数据类型是一组值和一组运算的集合;数据的类型决定该数据的值和该数据所能进行的运算。数据类型数据类型是程序设计语言用来定义和描述其操作对象特性的一种方法。它由一个值集和定义在该值集之上,用于创建、操纵该类型数据的操作集组成。数据类型的值集说明该种类型的变量或对象的取值范围;数据类型的操作集则说明了对该种类型的变量或对象可以施行那样一些操作和运算。同时,数据类型也为编译器在对程序进行编译时如何为各种类型的变量或对象分配存储提供了依据,也为硬件系统如何使用这些变量或对象提供了操作方法。2.1.1C,likemostothercomputerlanguages,supportsanumberofdifferenttypesofdata.Therearetwokindsofdata.Theyarevariablesandconstants.ie:variables dataconstantsGenerallyspeaking,therearefourkindsofdatatypesinClanguage:Basicdatatypesintegercharacterfloat(double)enumerationuser-definedtypeConstructeddatatypesarraydatatypestructuredatatypeuniondatatypePointerdatatypesNulldatatypevoidc的数据类型可分为基本类型和导出类型。基本类型(Basicdatatypes):包括整型和浮点型(即实数类型)。整型又包括各种整型(integer)、字符型(character)和枚举型(enumeration);浮点型又分为不同精度的浮点型(floatingpoint)。由于整数和浮点数都是算术量,所以基本类型又称为算术类型。导出类型(deriveddatatypes):包括数组、指针、结构和联合。从数据的结构上分,基本类型和指针类型是简单类型,即一个数据仅由一个成员组成;除指针以外的导出类型都是构造类型,即一个数据由多个成员组成。表2.1三个与类型有关的关键字:void,const和volatile。void是类型区分符,称为空类型(没有值的类型)。空类型有三种用途:说明函数值的类型(5.2.1节),表示函数无返回值;说明函数参数的类型(,.2.1节),表示函数无参数;说明指针的类型(7.1节),表示指针一的类型未确定。每种用途的含义及用法将在相应章节讲述。const和volatile是类型限定符,可用于修饰任何基本类型和指针类型。const用于将一个基本类型或指针类型的对象(即一个变量,或者说一个有名存储区)定义为常量,或同时将指针和指针所指对象定义为常量。本书仅介绍const用于定义基本类型常量的方法(2.2节),const的其他用法可查阅关于C++语言的书。volatile用于说明可以由该程序控制以外的其他过程修改的对象,这种情况通常发生在并发处理过程中,对此本书不作介绍(const和volatile同时说明一对象时,该对象在程序控制内不能被修改但可由程序控制以外的过程修改。2.1.2基本类型的名字及长度基本类型的名字(thenameofbasicdatatypes)基本类型的名字又称为类型名(typename)。类型名又称为类型区分符(typespecificator)。charint float double以及 short long和 signed unsigned解释P18EX1类型关键字的组合规则:signed和unsigned可用于修饰整型(char,short,int,long),但不能同时修饰;short和Iong可用于修饰int,但不能同时修饰;float不能使用任何修饰词;double可用Iong修饰。基本类型:charint float double修饰符:signed unsigned修饰符:short long组合规则:{char}+{signed,unsigned}{char}={char}+{signedchar,unsignedchar} ={char,signedchar,unsignedchar}{signed,unsigned}{int}+{short,long}{int}+{short,long}{signed,unsigned}{int}={signedint,unsignedint}+{shortint,longint}+{signedshortint,signedlongint,unsignedshortint,unsignedlongint}={signedint=int,unsignedint,shortint=signedshortint,longint=signedlongint,unsignedshortint,unsignedlongint}longdouble与具体机器系统有关的规定解释:见PP18-19解释:P19表2.2基本类型的名字及长度2.2常量和变量(costantsandvariables)常量(costants):程序运行期间其值不能被改变的量。Duringexecuting,thevalueofconstantcannotbechanged.变量(variable):程序运行期间其值可以被改变的量。Duringexecuting,thevalueofvariablecanbechanged.Thatis,youcanassignanewvaluetothevariableduringtheprogramisexecuting.1.分类(classification) 文字常量(literallconstants)常量符号常量(symbolicconstants)如:123,2004,3.14159都是文字常量 #definePI3.14159 #defineSIZE100 则PI和SIZE都是符号常量(symbolicconstants)。程序中PI是浮点数3.14159,SIZE是整数100。C中的常量:整数常量(integerconstant)、浮点数常量(floatingpointconstant)、字符常量(characterconstant)、字符串常量(stringconstant),分别简称为整数、浮点数、字符、字符串。枚举常量(enumerationconstant)属于整数类型,2.2.1常量的表示方法1.整数 十进制整数(decimal),十进制数字0-9组成的整数。八进制整数(octal-decima),八进制数字0-7组成的整数。十六进制整数(hexadecimal),十六进制数字0~9,A~F或a~f组成的整数。1)整数的语法格式(thesyntaxformatofaninteger) [前缀]整数部分[后缀]其中:[]表示方括号内的内容是可选项。其中,前缀:无前缀:表示十进制整数;0为前缀:表示八进制整数;0x或0X为前缀:表示十六进制整数。后缀: 后缀为u或U,表示无符号整数; 后缀为l或L,表示长整型整数; 后缀为ul或UL,表示无符号长整型整数。例如:32767,-32768,0,+123,32768L,65535u0177764,0101,+060,-040,0177777U 为合法的八进制整数0x0200,0X8000U1,0xffOxf5,0XFF00,-0xfff2 为合法的十六进制整数而: 0138,013a,13a x13a是一个标识符而不是一个十六进制整数2)不同进制整数之间的转换方法(thetransformationbetweendifferentnumbersystem)(1)N进制十进制(baseNsystemtodecimalsystem) N进制数:anan-1an-2…ai…a0十进制数:S=anNn+an-1Nn-1+an-2Nn-2+…+aiNi+…+a0N0八进制:N=8,ai=0,1,2,3,4,5,6,7十六进制:N=16,ai=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F如:0734=782+381+480=764+38+41=476解释P21EX1(2)十进制N进制 采用除N取余法。如: 十进制二进制,用除2取余法。 十进制八进制,用除8取余法。 十进制十六进制,用除16取余法。注意:后得到的余数是高位数,先得到的余数是低位数。解释P21EX2(3)十六进制八进制将十六进制数的每一位(不包括前缀)按从左至右顺序写成一个等值的二进制数,然后按从右至左的顺序将相邻的3位二进制数字写成一个等值的八进制数字0x13a=000100111010=000100111010=0472 八进制十六进制先将八进制数的每一位(不包括前缀。)按从左至右顺序写成一个等值的二进制数(3位).然后按从右至左的顺序将相邻的4位二进制数字写成一个等值的十六进制数字。0734=111011100=000111011100=0x1dc3)整数溢出(integeroverflow)解释P22EX12.浮点数(floatingpointnumber)1)浮点数的语法格式 解释:P22EX22)组成规则 解释:P22EX33)浮点溢出 解释:P23EX13.字符(character) 1)字符常数:通常称为字符,指用一对单引号(单撇号)界定的单个字符。如:’a’,‘X’,‘5’都是用字符的图形符号表示的字符常数,其类型为char。2)字符常数在机内的值为该图形符号在ASCII字符集中的编码(ASCII码)。P339附录A ASCII字符集中ASCII码为32~126的字符,称为可打印字符,0~31为控制字符。如:字符’a’,‘X’,‘5’的ASCII码依次为十进制值:97,88,53。3)注意:单引号字符本身(‘)和反斜线字符(\)不能用其图形符号来表示。 解释:PP23-24EX24)转义序列(escapesequences/backslashcharacterconstants)转义序列是以反斜线(\)开头的一个特殊的字符序列。一个转义序列代表的是一个字符的字符码,通常用于表示ASCII字符集中的控制字符和不能用图形符号表示的可打印字符。程序中常用的转义序列及其表示的字符见P24表2.3转义序列的两种形式:Ⅰ.反斜线后面跟一个图形符号;如:’\0’,‘\a’,‘\t’,‘\\’Ⅱ.反斜线后面跟一个字符的字符码(\000,\xhh),\000和\xhh称为转义序列的位型。如:’\r’,‘\015’,‘\15’,‘\x0d’,‘\xd’都表示回车符。解释:PP24EX14.字符串(string)1)字符串常数的语法格式(thesyntaxformatofstringconstants)字符串常数:是用一对双引号界定的一个字符序列,其形式为: “字符序列”字符串在机内存储时系统要在其末尾添加一个’\0’。’\0’用作字符串的结束标志,以使程序在处理字符串时便于确定字符串的长度。存储长度:包括‘\0‘在内的字符串长度是字符串的。字符串的存储长度要比字符串的实际长度大1例如:“abcd”是一个字符串。它在机内存储时形式(十六进制ASCII码)为:616263640字符串“abcd”的长度:4,存储长度:5。又例如:“abcd”是一个字符串。它在机内存储时形式(十六进制ASCII码)为:61623263640空格也是一个字符,它的ASCII码为:0x32。所以,字符串“abcd”的长度:5,存储长度:6。使用字符串时需要注意的问题:P26EX1(1)”a”与’a’问题61 ’a’为单个字符。存储表示:610”a”为单个字符组成的字符串。存储表示:(2)双引号的串内表示问题:用\”。如:”\”\”isanemptystring.”(3)单引号的串内表示问题:图形符号或转义序列皆可:如:”It’sasmallriver.”或”It\’sasmallriver.”两者等价。(4)反斜杠的串内表示问题:用两个反斜杠表示。如:“a:\\abc.txt”表示:a:\abc.txt续行问题(linecontinue)解释PP26-27EX2行末加反斜杠\2.2.2符号常量(symbolicconstants)解释P27EX1用#define定义符号常量 解释P27EX2用const定义符号常量 解释P28EX1两种方法之间的区别 解释P28EX22.2.3变量说明(variabledeclaration)1.变量说明形式(thegeneralformofvariabledeclaration): 类型区分符变量表;类型区分符:char,int,float,double或经过signed或unsigned修饰,或经过short或long修饰产生的数据类型说明符。变量表:标识符序列,标识符即变量名,标识符之间用逗号分隔。例如: intx,y,z; doubler,h; unsignedcharch1,ch2; unsignedlongintsum,even;声明变量时初始化(initializationduringvariabledeclaration):声明变量时初始化的形式(thegeneralform):类型区分符变量名1=表达式1,符变量名2=表达式2,…;举例intx=1,y=2,z=3; doubler=3.5,h=5.21; unsignedcharch1=’a’,ch2=’b’; unsignedlongintsum=0,even=0;关于 inti=j=0;与上下文有关intj;inti=j=0;/*合法*/ 当没有事先声明变量j时,inti=j=0;才非法,2.3运算符和表达式(operatorsandexpressions)1.运算符(operators)1)运算符(操作符) 运算符是c语言的六类单词之一,运算符执行对运算对象(称为操作数)的各种操作。2)按操作数的数目分类:单目(或一元unary)运算符:即只有一个操作数的运算符;如:-5,x++。双目(或二元binary)运算符:即有两个操作数的运算符;如:a+b,x*y。三目(或三元ternary)运算符:即有三个操作数的运算符;(x>0)?x:-x中?:运算符3)运算符的功能分类,算术运算符(arithmeticoperator)关系运算符(relationaloperator)逻辑运算符(logicaloperator)自增和自减运算符(incrementanddecrementoperator)位运算符(bitwiseoperator)赋值运算符(assignmentoperator)条件运算符(conditionaloperator)上述运算符统称为一般算术运算符,它们所执行的运算功能称为一般算术运算。此外,用于表示数组下标的方括号[]:下标运算符,如:x[3]表示函数参数表的圆括号():函数调用运算符,如:fun(10)表示表达式求值顺序的逗号,:顺序求值运算符,如:x=1,y=2,z=3;表示强制类型转换的符号(类型名):类型强制符,如:(int)y也都作为运算符看待。2.表达式(expressions)表达式:是由运算符和操作数组成的符合C的语法的算式。表达式是对运算规则的描述并按规则执行运算;运算的结果是一个值,称为表达式的结果(或值),结果值的数据类型称为表达式的类型。ISO/IEC9899:1999(E)关于基本表达式(Primaryexpressions)语法和语义的规定:6.5.1Primaryexpressions
Syntax(语法):1primary-expression:
identifier
constant
string-literal
(expression)Semantics(语义):2Anidentifierisaprimaryexpression,providedithasbeendeclaredasdesignatinganobject(inwhichcaseitisanlvalue)orafunction(inwhichcaseitisafunctiondesignator).76)3Aconstantisaprimaryexpression.Itstypedependsonitsformandvalue,asdetailedin6.4.4.4Astringliteralisaprimaryexpression.Itisanlvaluewithtypeasdetailedin6.4.5.5Aparenthesizedexpressionisaprimaryexpression.Itstypeandvalueareidenticaltothoseoftheunparenthesizedexpression.Itisanlvalue,afunctiondesignator,oravoidexpressioniftheunparenthesizedexpressionis,respectively,anlvalue,afunctiondesignator,oravoidexpression.从严格的定义上讲,表达式定义为:程序中的常量、变量、有返回值的函数调用是表达式;以表达式为操作数的表达式是表达式;用()括起来的表达式,即“(表达式)”也是表达式。结论:表达式的定义是递归的。即:用表达式定义表达式。3.运算符的优先级与结合性(precedenceandassociativityofoperators)1)优先级(precedence):指运算执行的先后顺序。高者先运算。2)结合性(associativity):指处于同一优先级的运算符的运算执行的先后顺序。分:从左至右(lefttoright):处于同一优先级的运算符中,位于左边的先执行。表2.4中优先级1、3等。从右至左(righttoleft):处于同一优先级的运算符中,位于右边的先执行。表2.4中优先级2、13、12.3.2算术运算(arithmeticoperations)算术运算符(arithmeticoperators):+(单、双目加),-(单、双目减),*(乘),/(实数除、整数除),%(求余数或取模),并且,%操作数必须为整型。2.算术表达式的形式为(thegeneralformofarithmeticoperations):+expr 或 -expr 或 exprlopexpr2其中,expr、expr1、expr2是表达式,代表操作数;op代表+,-,*,/和%运算符之一。3.含义(meanings):与数学含义相同。Sameasthemeaningsinmathematics.4.运算结果的类型(typeofthearithmeticoperations):与操作数类型相同;如果操作数执行了类型转换,则与转换后的操作数类型相同。5.运算中的类型转换:解释P33EX1转换原则:最大限度的减少精度损失。6.算术表达式的应用举例:解释PP33-34EX22.3.3关系运算1.关系运算符有: <,<=,>,>= (优先级6) ==,!= (优先级7)== equalto(.EQ.toFortraners)!= notequalto> greaterthan< lessthan>= greaterthanorequalto<= lessthanorequalto2.优先级(见表2.4)3.使用形式:expr1opexpr2其中,expr1,expr2是操作数,op关系运算符。每个操作数是一个表达式。操作数可以为任何基本类型,一般为整型。4.功能:比较两个操作数值的大小。5.运算结果:如果两个操作数关系成立,则结果的值为非0(一般为整数1,表示逻辑“真”),否则为。(表示逻辑“假”);结果类型一律为int。6.注:C语言中没有表示逻辑真值和逻辑假值的布尔数据。关系运算中任何非。值都表示逻辑真,。值则表示逻辑假。7.应用举例P35EX12.3.4逻辑运算1.逻辑运算符有:&&(逻辑与)||(逻辑或)!(逻辑非)2.逻辑表达式的形式为:!exprexpr1&&expr2expr1||expr23.操作数类型:每个操作数是一个表达式。操作数可以为任何基本类型,运算时不执行类型转换。任何非。值操作数(无论正负或绝对值的大小)均视为真.0值视为假。4.运算结果值:值为非0整数(一般为1,表示结果为真),或0(表示结果为假);5.结果类型:一律为int。6.逻辑运算规则: 见P36表2.5逻辑运算符的运算规则表2.5逻辑运算符的运算规则iji&&ji||j!i00001010111001011110&&(逻辑与): expr1!=0且expr2!=0(expr1&&expr2)!=0expr1==1且expr2==1(expr1&&expr2)==1||(逻辑或): expr1!=0或expr2!=0(expr1||expr2)!=0expr1==1或expr2==1(expr1||expr2)==1!(逻辑非): expr!=0!expr==0expr==1!expr==07.举例:P36-37例1-例4补充:测试c是否是字母:c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’补充:测试c是否是数字字符:c>=’0’&&c<=’2.3.5自增(increment)和自减(decrement)运算1.自增和自减运算符:++,--优先级:2级见P32表2.43.++和—有前缀式(Prefix)与后缀式(decrement)之分:关于前缀式:设有变量:y=0,x=0(1)Prefixincrement:先自增,然后用自增的值参与运算。如: y=++x;此时,x=1,y=1(2)Prefixdecrement:先自减,然后用自减的值参与运算。 如: y=--x;此时,x=-1,y=-1关于后缀式:(1)Postfixincrement:先用原值参与运算,然后自增。如: y=x++;此时,x=1,y=0(2)Postfixdecrement:先用原值参与运算,然后自减。。 如: y=x--;此时,x=-1,y=04.++和—的操作数可以是任意实型(real,即实数类型,包含P19表2.2全部类型)或指针类型的左值表达式。Theoperandoftheprefixincrementordecrementoperatorshallhavequalifiedorunqualifiedrealorpointertypeandshallbeamodifiablelvalue.5.左值表达式或左值(lvalue) 具有存储单元且能够被赋值的操作数称为左值表达式或左值。Thename‘‘lvalue’’comesoriginallyfromtheassignmentexpressionE1=E2,inwhichtheleftoperandE1isrequiredtobea(modifiable)lvalue.6.关于计算延迟和序列点的概念P38EX17.应用举例P38-39EX22.3.6位运算1.位运算操作符~、 &、 |、 ^、 <<、 >>分别表示: 按位取反(Bitwisecomplementoperator~)、按位与(BitwiseANDoperator&)、按位或(BitwiseinclusiveORoperator|)、按位异或(BitwiseexclusiveORoperator^)、按位左移(Bitwiseleft-shiftedoperators<<)、按位右移(Bitwiseright-shiftedoperators>>)注意: (1)操作数必须是整数。 (2)按位运算是指以逐个二进制位为直接处理对象的运算。 (3)优先级参阅P32表2.42.原码、反码和补码(1)数据在计算机内部都是以二进制码补码的形式存储。(2)原码定义:正数的原码的最高位(符号位)为0,其余各位等于其本身;负数的原码位为最高位为1,其余各位为该数的绝对值。举例:分别写出35和-35的原码。0010001135的原码:10100011-35的原码:01111111127的原码:11111111-127的原码:(3)反码定义:正数的反码与原码相同;负数的反码为它的正数连符号位一起按位取反而成。举例:分别写出35和-35的反码。0010001135的反码:11011100-35的反码:01111111127的反码:10000000-127的反码:思考题:0的反码唯一吗?能否给出具体例子?(4)补码定义:正数的补码表示与原码相同;负数的补码为其反码加1(在最低位加)而得。举例:写出-35反码。11011100-35的反码:11011101方法2:10100011-35的原码:11011100符号位不动,其余位变反:11011101最低位加1:结论:负数的补码为其原码符号位不动,其余位变反,再加1而得(俗称“变反加1”(5)为什么要引入补码的概念?变减法运算为加法运算。例如;39-35=39+(-35)0010011139的补码:11011101-35的补码:00000100 溢出1 结果为4。3.按位取反运算~(1)形式: ~exprwhere,exprisanoprand.(2)Constraintsseen843P89Exprisanintegerexpression.(3)SemanticsEachbitintheresultissetifandonlyifthecorrespondingbitintheconvertedoperandisnotset.(4)Examplevoidmain(void){ shortintx=0,y=5; printf("~x=%d\n",~x); printf("~y=%d\n",~y); printf("x=%d\n",x); printf("y=%d\n",y);}Theresults(i.e.thescreenoutput):~x==-1~y=-6x=0y=5(5)P41example1,example2,example3andexample44.按位与(BitwiseANDoperator&)、按位或(BitwiseinclusiveORoperator|)、按位异或(BitwiseexclusiveORoperator^)(1)Form: expr1opexpr2Where,opcanbea&,a|,ora^.Constraintsexprandexpr2areoprands,Eachoftheoperandsshallhaveintegertype.Semanticsof&a.Theusualarithmeticconversionsareperformedontheoperands.b.Theresultofthebinary&operatoristhebitwiseANDoftheoperands(thatis,eachbitintheresultissetifandonlyifeachofthecorrespondingbitsintheconvertedoperandsisset).Semanticsof|a.Theusualarithmeticconversionsareperformedontheoperands.b.Theresultofthe|operatoristhebitwiseinclusiveORoftheoperands(thatis,eachbitintheresultissetifandonlyifatleastoneofthecorrespondingbitsintheconvertedoperandsisset).Semanticsof^a.Theusualarithmeticconversionsareperformedontheoperands.b.TheresultoftheˆoperatoristhebitwiseexclusiveORoftheoperands(thatis,eachbitintheresultissetifandonlyifexactlyoneofthecorrespondingbitsintheconvertedoperandsisset).SeeP42表2.6按位逻辑运算的运算规则ExplainP42表达式举例(1)、(2)、(3)。5.移位运算(Bitwiseshiftedoperators)按位左移(Bitwiseleft-shiftedoperators<<)按位右移(Bitwiseright-shiftedoperators>>)SyntaxSeeISO/IEC9899:1999(E)6.5.7Bitwiseshiftoperatorsa.shift-expression:additive-expressionshift-expression<<additive-expressionshift-expression>>additive-expressionExplain:SeeISO/IEC9899:1999(E)6.5.7Bitwiseshiftoperatorsexplanations:(6.5.3)unary-operator:oneof&*+-˜!(6.5.4)cast-expression:unary-expression(type-name)cast-expression(6.5.5)multiplicative-expression:cast-expressionmultiplicative-expression*cast-expressionmultiplicative-expression/cast-expressionmultiplicative-expression%cast-expression(6.5.6)additive-expression:multiplicative-expressionadditive-expression+multiplicative-expressionadditive-expression-multiplicative-expressionConstraintsb.Eachoftheoperandsshallhaveintegertype.Semanticsc.Theintegerpromotionsareperformedoneachoftheoperands.Thetypeoftheresultisthatofthepromotedleftoperand.Ifthevalueoftherightoperandisnegativeorisgreaterthanorequaltothewidthofthepromotedleftoperand,thebehaviorisundefined.d.TheresultofE1<<E2isE1left-shiftedE2bitpositions;vacatedbitsarefilledwithzeros.IfE1hasanunsignedtype,thevalueoftheresultisE12E2,reducedmoduloonemorethanthemaximumvaluerepresentableintheresulttype.IfE1hasasignedtypeandnonnegativevalue,andE12E2isrepresentableintheresulttype,thenthatistheresultingvalue;otherwise,thebehaviorisundefined.e.TheresultofE1>>E2isE1right-shiftedE2bitpositions.IfE1hasanunsignedtypeorifE1hasasignedtypeandanonnegativevalue,thevalueoftheresultistheintegralpartofthequotientofE1/2E2.IfE1hasasignedtypeandanegativevalue,theresultingvalueisimplementation-defined.解释:教材P42-43EX1解释:教材P43EX2 表达式举例例1,例2,例315141312111098765432100011010100100000M=10,n=6,m-n+1=5x>>(m-n+1)等价于x>>515141312111098765432100000000110101001~0<<n15141312111098765432101111111111000000~(~0<<n)15141312111098765432100000000000111111x>>(m-n+1)&~(~0<<n)151413121110987654321000000000001010012.3.7赋值运算概念:(1)赋值:把数据存入(或写人)变量对应的存储单元。注意:c语言中赋值操作是作为一种运算符来处理的,从而形成赋值表达式。(2)分类:赋值运算可以分为简单赋值运算,以及复合赋值运算两类。(3)优先级优先级(见表2.4),赋值运算符的优先级仅高于逗号运算符,结合性为右结合。(4)形式:el=e2 或 elop=e2其中op表示复合赋值运算符左边的一个运算符,el和e2是操作数。(5)操作数:左操作数el必须是一个基本类型的变量(即左值表达式),右操作数e2是一个基本类型的表达式;el,e2可以为不同的基本类型。(6)运算结果:赋值表达式的值和类型与赋值后左操作数el的值和类型相同。(7)类型转换(赋值转换):计算右操作数e2时遵循一般算术转换规则,对左操作数e1不执行任何类型转换;如果e2结果的类型与e1不相同,则在执行赋值之前将e2的结果转换为左操作数e1的类型。2.简单赋值运算(Simpleassignment)(1)形式: el=e2(2)功能:将计算出的右操作数的值存人左操作数对应的存储单元。左操作数e1必须是一个左值表达式。(3)举例P44-45EX13.复合赋值运算(Compoundassignment)(1)复合赋值运算符: +=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=(2)形式:elop=e2 表示先做e1ope2操作,然后将操作结果赋给e1。同理,左操作数e1必须是一个左值表达式。当e1,e2是简单变量时,其等价形式为:el=elope2AcompoundassignmentoftheformE1op=E2differsfromthesimpleassignmentexpressionE1=E1op(E2)onlyinthatthelvalueE1isevaluatedonlyonce.Seen843p94(3)举例P45EX1注意:当e1,e2不是简单变量时,复合赋值表达式与它的展开式不一定等价。 解释:P45EX24.表达式求值的副作用(1)表达式求值的副作用:一个变量的值由于计算表达式的值而发生了改变,这种效应称为表达式求值的副作用。(2)表达式求值的副作用与表达式求值的顺序有关表达式求值的顺序由运算符的优先级与结合性决定后缀式++和--的计算延迟到序列点为止两种情况标准C没有规定表达式求值的顺序<1>具有交换律的运算符(双目、和+)的操作数求值的顺序不确定。P45EX3<2>函数调用参数的求值顺序不确定。P46EX42.3.8条件运算(Conditionaloperation)(1)条件运算符(Conditionaloperator) ?: 条件运算符为三目运算符,其表达式称为问号表达式。(2)形式 e1?e2:e3优先级P32表2.4Constraints可以参考P46EX1a.Thefirstoperandshallhavescalar(数量,标量)type.b.Oneofthefollowingshallholdforthesecondandthirdoperands:—bothoperandshavearithmetictype;—bothoperandshavecompatiblestructureoruniontypes;—bothoperandshavevoidtype;—oneoperandisapointerandtheotherisanullpointerconstant.Semantics(有省略)Seen843p91c.Thefirstoperandisevaluated;thereisasequencepointafteritsevaluation.Thesecondoperandisevaluatedonlyifthefirstcomparesunequalto0;thethirdoperandisevaluatedonlyifthefirstcomparesequalto0.见P47图2.1问号表达式的流程图。d.theresultisthevalueofthesecondorthirdoperand.表达式举例:P47-48例1-例42.3.9顺序求值运算(commaoperator)Seen843p94(1)commaoperator,(2)Form expr1,expr2 优先级最低,左结合。(3)SemanticsTheleftoperandofacommaoperatorisevaluatedasavoidexpression;thereisasequencepointafteritsevaluation.Thentherightoperandisevaluated;theresulthasitstypeandvalue.83)Ifanattemptismadetomodifytheresultofacommaoperatorortoaccessitafterthenextsequencepoint,thebehaviorisundefined.(4)表达式举例:P48例1,例2补充:Inthefunctioncallf(a,(t=3,t+2),c)thefunctionhasthreearguments,thesecondofwhichhasthevalue5.2.4类型强制类型转换分类:一般算术转换:除赋值运算外的基本运算所引起的类型转换;赋值转换:执行赋值运算引起的类型转换强制类型转换:由类型强制运算符引起的类型转换;函数调用转换。执行函数调用而引起的参数的类型转换。2.一般算术转换(1)规则:值域较窄的那个类型向值域较宽的那个类型转换。(2)转换方向:char/short→int→unsigned→long→unsignedlong→float→double→longdouble(3)两个特殊的情况:P4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024港口机械设备节能改造EMC合同
- 2025年度股权转让合同:股东甲将其持有的乙公司股权转让给丙方3篇
- 二零二五年度驾校教练车转让及驾校教学场地租赁合同6篇
- 2025年冀教新版高三物理下册月考试卷
- 2025年外研版三年级起点九年级物理下册月考试卷含答案
- 2025年度屋顶花园采光井阳光棚建设与维护管理合同3篇
- 2025年度仓储物流企业仓单质押贷款解决方案合同3篇
- 2025年浙教新版三年级语文下册阶段测试试卷含答案
- 2025年苏人新版八年级物理下册月考试卷含答案
- 2025年沪教新版九年级化学下册月考试卷含答案
- 房屋代持协议协议书2024年
- 2024至2030年中国船供油行业市场竞争现状及发展趋势分析报告
- 2025年中考英语热点时文阅读-发明创造附解析
- 反诉状(业主反诉物业)(供参考)
- 《飞机载重平衡》-课件:认知配载工作流程
- 装饰材料与施工工艺智慧树知到答案2024年泉州华光职业学院
- 大学生心理健康教育常见困扰与自我调适智慧树知到期末考试答案章节答案2024年浙江师范大学
- 工程资金监管协议范本
- 服装新店开业活动促销方案
- 行测言语理解与表达真题及完整答案1套
- 肥尾效应(前渐进论、认识论和应用)
评论
0/150
提交评论