C语言知识点串讲_第1页
C语言知识点串讲_第2页
C语言知识点串讲_第3页
C语言知识点串讲_第4页
C语言知识点串讲_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言知识点串讲1.1程序设计和程序设计语言1.程序从最一般的意义来说,程序是对解决某个计算问题的方法(算法)步骤的一种描述;而从计算机来说,计算机程序是用某种计算机能理解并执行的计算机语言作为描述语言,对解决问题的方法步骤的描述。计算机执行按程序所描述的方法步骤,能完成指定的功能。所以,程序就是供计算机执行后能完成特定功能的指令序列。一个计算机程序主要描述两部分内容:描述问题的每个对象和对象之间的关系,以及描述对这些对象作处理的处理规则。其中关于对象及对象之间的关系是数据结构的内容,而处理规则是求解的算法。针对问题所涉及的对象和要完成的处理,设计合理的数据结构常可有效地简化算法,数据结构和算法是程序最主要的两个方面。2.程序设计的任条和主要步骤程序设计的任务就是分析解决问题的方法步骤(算法),并将解决问题算法的方法步骤用计算机语言记录下来。程序设计的主要步骤包括:认识问题、设计解决问题的算法、按算法编写程序、调试和测试程序。在程序开发过程中,上述步骤可能有反复,如发现程序有错,严重情况可能会要求重新认识问题和重新设计算法等。3.机器语言和汇编语言计算机能直接识别和执行的二进制代码称为计算机的机器语言。用有助于记忆的符号来代表二进制代码,称为汇编语言。汇编语言与机器语言几乎有一对一的关系。用汇编语言编写的程序称为“汇编源程序”,汇编源程序不能在计算机上直接执行,需要用汇编程序将汇编源程序翻译成机器语言程序,然后执行由汇编程序翻译出来的机器语言程序。机器语言和汇编语言是与具体计算机紧密相关的,称它们是面向机器的语言。4.高级语言与机器语言和汇编语言相比较,高级语言与具体计算机无关,是一种能方便描述算法过程的计算机程序设计语言。高级语言种类千差万别,但一般包含有以下四种成分:数据成分用来描述程序所涉及的数据;运算成分用来描述运算;控制成分用来表达程序的控制构造;传输成分用来表达数据的传输。由于高级语言程序主要是描述计算机的解题过程,即描述复杂的加工处理过程,所以也称这种高级语言为面向过程语言。用高级语言编写的程序称为“源程序”。计算机不能直接技源程序的语句运行,通常有解释方式和编译方式两种方法在计算机上执行源程序。解释方式,即让计算机运行解释程序,解释程序逐句取出源程序中的语句,对它作解释执行,输入数据,产生结果。编译方式,即先运行编译程序,从源程序一次翻译产生计算机可直接执行的二进制程序(称为目标程序);然后让计算机执行目标程序,输入数据,产生结果。解释方式的主要优点是计算机与人的交互性好,调试程序时,能一边执行一边直接改错,能较快得到一个正确的程序。缺点是逐句解释执行,运行速度慢。1编译方式的主要优点是计算机运行目标程序快,缺点是修改源程序后必须重新编译以产生新的目标程序。现在也有将上述两种方式结合起来的,即先编译源程序,产生计算机还是不能直接执行的中间代码,然后让解释程序解释执行中间代码。这样做的好处首先是比直接解释执行快;更大的好处是中间代码独立于计算机,只要有相应的解释程序,就可在任何计算机上运行。5.面向问题语言面向问题语言是为了易于描述和求解某类特定领域的问题而专门设计的一种非过程语言。用面向问题语言解题时,不仅摆脱计算机的内部逻辑,也不必关心问题的求解算法和求解的过程,只需指出问题是做什么,数据的输入和输出形式,就能由相应的计算机系统得到所需结果。如报表语言、SOL(StructuredQueryLanguage)语言等。SQL语言是数据库查询和操纵语言,能直接使用数据库管理系统。由于使用面向问题语言来解题只要告诉计算机做什么,不必告诉计算机如何做,能方便用户的使用和提高程序的开发速度。但实现面向问题语言的系统从最一般的意义下实现问题如何求解,通常实现的效率较低。另外,面向问题语言要求问题已有通用的求解方法,目前其应用范围还比较狭窄。1.2C语言基础.C语言的发展史目的是为编写系统程序研制一种高级程序语言。1963年,参照ALGOL60语言,增添了能描述计算机硬件特性的能力,称为CPL语言。1967年,作进一步的简化,改称BCPL语言。1970年,再进一步简化,并突出了硬件处理能力,称为B语言,并用于编写UNIX操作系统。1972年,进一步扩充数据类型和恢复通用性,称为C语言,并用C语言重写了UNIX操作系统。以后C语言开始流行,为统一版本,ANSI于1987年制定了C语言的标准,称为ANSIC.2.C语言的特点C语言主要有以下特点:(1)与其它高级语言比较,更接近硬件,与机器语言比较,又更接近算法。C程序易编写、易读、易查错和易修改。(2)数据类型与运算符丰富,描述算法更简单方便。(3)C程序的结构简单,语言包含的语句类别少。(4)是一种结构化语言,提供完善的结构化程序控制结构,适宜采用结构化程序设计方法开发程序。(5)也是一种模块化程序设计语言,适宜大型程序的研制和开发。(6)通常C系统都提供大量的库函数供程序开发人员选用,能简化程序开发。3.C程序的基本结构通常一个C程序包括一个或多个函数,其中必有一个main函数,称为主函数。C函数的定义主要2分两部分:函数说明部分和函数体。其中函数体由C语言的语句序列组成,实现函数的功能。C程序总是从主函数开始执行。4.C语言的基本语句C语言的语句主要分以下几种:(l)数据定义语句——用来定义程序中使用的各种数据,及能存放数据的对象的名称和特性。(2)表达式语句——任何在有意义的表达式之后接上分号(;)构成的语句。最常见的有赋值表达式和函数调用表达式后加分号构成的表达式语句,分别称为赋值语句和函数调用语句。(3)流程控制语句——用来控制程序执行过程的语句。它们有选择控制语句、循环控制语句、break语句。continue语句、return语句和goto语句等。(4)复合语句——用花括号括住一个语句序列,即构成复合语句。复合语句用来表示其中的语句序列是一个整体,在逻辑上是单个语句,并且强调其中的语句按顺序逐一执行。(5)空语句——只有单个分号(;)构成的语句。空语句表示没有任何操作,用于选择控制或循环控制没有特别被控制的成分语句,或在复合语句的末尾放置语句标号等。(6)其它语句——如类型定义语句等。5.注释为了便于阅读和理解程序,可以在程序的任何地方插入注释,以说明程序、函数、程序段。语句的功能或采用的算法。C语言的注释是用/*“和”*/“括住的任意字符列。程序编译时,注释不参与编译,也不会出现在目标程序中。6.C语言的字符集C语言的基本字符集有:(l)数字10个(0~9)。(2)英文字母大、小写各26个(A~Z,a~z)。(3)键盘符号33个,用于构成特殊符号,其中下线字符“起一个英文字母的作用,以构成标识符等语法成分。(4)转义字符,转义字符是由字符(\)开始后跟单个字符或若干字符组成,通常用于表示控制代码或特殊符号。7.C程序的基本词汇C语言的基本词汇有:(1)字面形式常量。如100、15.0、„A?、“ABC”。3(2)特殊符号。主要是运算符。(3)保留字。在程序或语句中是用来表示特定语法含义的英文单词。(4)标识符。用于命名程序对象,如变量、常量、函数、标号等。在C语言中,一个合理的标识符由英文字母或下线符开头,后跟或不跟由字母、下线符、数字符组成的字符列。~般以下线符开头的标识符作为系统内部使用。利用基本词汇,按照给定的C语言的句法规则就可命名程序对象,描述表达式计算、构造语句、函数,直至整个程序2.1C语言的数据类型数据类型包含两方面的内容:数据的表示和对数据加工的操作。数据的全部可能表示构成数据类型的值的集合。数据全部合理的操作构成数据类型的操作集合。在C语言中,把整型、实型和字符型称为基本数据类型,又称整型和实型为数值型。为了描述更复杂的数据结构,C语言还有构造类型、指针类型、放举类型和空类型。构造类型是指由若干个相关的数据组合在一起形成的一种复杂数据类型。1.整型整型数据按其存储在内存中的二进位信息的最高位是当作数值信息位还是当作数据的符号位,将整型数据分成带符号整型和无符号整型两种。每种整型又按所需的字节个数的多少分成三种。所以整型共有6种:带符号整型(int)、带符号短整型(shortint)、带符号长整型(longint,或long)、无符号整型(unsignedint)、无符号短整型(unsignedshortint)以无符号长整型(unsignedlong)。2.实型实型数据有表示范围和精度两个不同的特征,为了适应数的范围和精度的不同要求,实型数据分三种类型:单精度型(也称浮点型float)、双精度型(double)、长双精度型(longdouble)3.构造类型构造类型是指由若干个相关的数据组合在一起形成的一种复杂数据类型,构造数据类型的成分数据可以是基本数据类型的,也可以是别的构造类型的。按构造方式和构造要求区分,构造类型主要有数组类型、结构类型和共用类型。数组类型是由相同类型的数据组成;结构类型可以由不同类型的数据组成;当不同数据类型不会同时使用时,以节约内存,让不同数据占用同一区域,这就是共用类型。4.指针类型指针类型是取程序对象(如变量)在内存中占居的地址为值的一种特殊的数据类型。5.枚举类型当变量只取很少几种可能的值,并分别用标识符对值命名时,这种变量的数据类型可用枚举类4型来表示。如变量表示一个星期中的某一天,就可用校举类型描述该变量的类型,并以星期见的英文名对日期命名,对应的变量取某日的星期名称为其值。6.void类型用保留字VOid表示的数据类型有两种完全相反的意思,或表示没有数据(没有结果、没有形式参数),或表示某种任意类型的数据(如又与指针结合,用void.标记)。void表示空类型,void.表示任意数据的指针类型,程序如要使用void.类型的数据,应该将它强制地转换成某种具体的指针类型。2.2常量常量是指程序运行过程中其值不可改变的数据。常量按其值的表现形式可分为如下类型:整型常量、实型常量、字符型常量、字符串常量和指针常量。1.整型常量C语言整型常量的书写形式有三种:(1)十进制整数。通常整数的写法,如0,123,-45,+25.(2)八进制整数。以数字符0开头并由数字符0-7组成的数字符序列,为八进制整数。如0123表示八进制整数,其值等于十进制整数l*8*8+2*8+3=83.(3)十六进制整数。十六进制整数以OX(或OX)开头的整数。表示十六进制数的数字将有16个,它们分别是0-9和A、B、C、D、E、F,其中六个英文字母也可以小写。例如,0x123表示十六进制整数,其值等于十进制整数1*16*16+2*16+3=291;oxabc,其值等于10*16*16+11+16+12=2748.整型常量也可在整数之后接上字母L(或l),特别指明它是long型的。整型常量也可在整数之后接上字母U(或u),特别指明是不带符号的,即是unsigned型的。为指明不带符号的long型整型常量,则需在整数之后同时加上字母U和L,表明该整型常量是unsignedlong型的。整型数据以二进制形式存放,要求短整型数据的字节数不能大于整型数据的字节数;整型数据的字节数不能大于长整型数据的字节数。对于带符号的整数,用二进制代码的最左二进位作为数的符号,1表示负数,0表示正数。2.实型常量C语言实型常量的一般书写格式是:正负号整数部分。小数部分指数部分其中,正负号可有可无,无正负号即为正实数;整数部分和小数部分都是十进数字符序列;指数部分是e(或E)后接上正负号(正号可有可无)和十进数字符序列。按上述格式书写实型常量,另有两条限制:5(l)整数部分和小数部分可以任选,但不可同时都没有。(2)小数点和指数部分不可以同时都没有。ANSIC引入两个后缀字符,用f标识float型实型常量,用1(或L)标识fongdouble型实型常量,而无后缀符的实型常量被认为是double型的实型常量。要注意实型常量的有效位数,不要以为写上的数字都能被计算机所接受。在大多数C系统中,一个float型实型数据在内存中占用4个字节(32个二进位),约7个十进位有效数字,能表示绝对值最接近0的实数约为10的-38次方,最大的实数约为10的38次方。例如,对于代码floatx=123456.123f,在大多数系统中,实型常量123456.123f的最后两位数字是无效的。double型实型数据占用8个字节(64个二进位),约15个十进位有效数字,能表示绝对值最接近0的实数约为10的一308次方,最大的实数约为10的308次方。3.字符常量字符型数据用于表示一个字符值,但字符型数据的内部表示是字符的ASCll代码(8位二进位的二进制形式)。字符型数据的类型符用char来标记。字符型常量的书写方法:(l)普通字符——用单引号括起一个字符。如„a?、„b?、„B?、„$?。(2)特殊字符——用„\字符或字符列采标记。这种标记方法有三种:„\特定字符?,标记特定控制符,如换行符用„\n?来标记。?„\1至3个人进制数字?,以人进数表示字符的ASCll代码。„\X1至2个十六进制数字符?,以十六进制数表示字符的ASCll代码。由于字符以代码存放,所以也可把字符值当作一个小整数。反之,一个小整数也可把它理解为是某个字符的代码,把它当作一个字符。4.字符串常量字符串常量用来表示一个字符序列,它的书写方法用双引号括住字符序列。例如:“ABC”、“”等。字符串常量“”是一个空字符串,即不含任何有效字符的字符串。字符串数据顺序存储字符串字符的ASCll代码,并在最后字符后面存储一个H进制代码全为0的特殊字符,用来标记字符串的结束。所以字符串常量“1234”在内存占5个字节,而空字符串只占一个字节。字符串中的字符也可以是转义字符。5.符号常量为了提高程序的可读性,常量可以用以下形式命名:#define标识符常量其中的标识符也称作符号常量,这里的常量是前面所述的某种常量、或是程序中前面定义的符号常量。例如:6#defineMAXN1002.3变量变量是程序执行时,其值允许改变的数据对象,用来存储输入数据、计算的中间结果和程序的最终结果等。1.变量定义变量用标识符命名,通过变量定义引入的变量名习惯用英文字母开头,C系统可能也会预定义一些标记系统特性的变量,系统定义的变量习惯用下线字符开头。变量的数据特性由变量定义时指定的类型确定。若定义指定数据类型的变量(即不在指定数据类型基础上定义新数据类型的变量,如指定类型的指针、数组等),这种变量定义的句法为:数据类型符变量名1,变量名2,……;编绎系统根据变量的数据类型确定存放它的值所需要的内存字节数,变量值的内部表示形多也由其类型确定。2.内部变量和外部变量变量按其定义出现在程序中的位置不同分成两类:在函数内定义的变量称为内部变量,而在函数之外(函数之间)定义的变量称为外部变量。3.变量的存储类型系统按程序对计算机存储空间使用的不同要求,将内存分成不同用途的块,与计算机的寄存器一起将存储空间分成不同类别。而C程序通过指定变量的存储类表明变量的不同的使用要求,让系统将变量分配于不同的内存块或寄存器。如在上述变量定义形式中,还要指定变量的存储类型,变量定义的形式为:存储类型符数据类型符变量名1,变量名2,…;其中存储类型有四种:auto(自动的)、static(静态的)、register寄存器的)和extem外部的)。外部变量只允许被指定为静态的,或不指定其存储类型。内部变量可以被指定为自动的或静态的、或寄存器的、或不指定存储类型,若不指定存储类型,它就是自动的。自动变量是内部变量,在函数内或复合语句内定义,它们被分配在堆栈区。静态变量可以是内部变量,也可以是外部变量。静态变量表示永久性和专用性,即在程序执行过程中一直存在,局限于定义它的函数(内部静态变量)或局限于定义它的程序文件中那些函数(外部静态变量)。静态变量被分配在与程序相联的内存数据区。寄存器变量是函数的内部变量或参数,也是一种临时性的变量。如因函数使用非常频繁程序希望将它分配在寄存器,程序就可将变量指定为寄存器的,但编译系统也可能把它当作动变量处理。指定存储类型是外部的,实际b是告诉编译器,这个变量是一个外部变量,在这里要使它,而它7的定义或在别的程序文件或在后面的程序段等别的地方。4.变量的作用域和生存期变量的使用要注意变量的作用域(可使用范围)和生存期(存在的时间)。C语言规定,内部变量的作用域只局限于定义它的函数或复合语句。自动的内部变量是一种临时性变量,函数被调用时分配,函数执行结束时释放。而静态变量在程序执行前分配,直至程序结束才释放。由于静态的内部变量在函数结束时,依旧保持存储,函数上一次调用时留在内部静态变量中的结果能被下一次调用时继续使用。外部变量也在程序启动前分配,直至程序执行结束释放。普通的外部变量能提供别的源程序文件中的函数使用(要对它作外部说明);静态的外部变量只能供定义它的源程序中的全部函数专用。由于外部变量能供整个程序使用,所以外部量不能重名。5.变量定义初始化变量定义是对变量的存储空间提出一种要求,存储空间分配后,变量的初值通常是不拔的。但程序可以要求系统在为变量分配存储空间同时为变量设定初值,这就是变量定义初始化。在变量的定义形式中,在变量名之后接上“=初值表达式”,该初值表达式的值就作为该变量的初值。C语言另有约定,对于静态变量和外部变量,若定义它们时未指定初值,系统给它们设置成全部二进位都是0的值。以下是各种变量定义的例子:(l)定义整型,并对其初始化。ShortminInt=100;inti=l,j=2,k=3;longp=-1L,q=1234567890L;unsignedusi=254u;unsignedlongup=4294967295UL;(2)定义字符型变量,并对其初始化。charch=„A?;(3)定义实型(浮点型、双精度型)变量,并对其初始化。floatf=1.23456f;doubled=1.2345678op87654;2.4运算符每个运算符都代表对运算对象的某种运算,都有自已特定的运算规则,规定运算对象的个数、运算对象数据类型,以及运算结果的数据类型。C语言还规定运算符有不同的优先级和结合性。运算符的优先级指表达式求值时,按运算符的优先级由高到低的次序计算。如“先乘除后加减”。运算符的结合性是指运算符要求它的运算对象对它的结合方向。结合性确定了在相同优先级运算符连续出现的情况下运算对象与运算符结合的顺序,通常也是计算顺序。如算术运算符的结合性是从左至右8的,则连续的加减或连续的乘除是从左向右计算。而赋值运算符的结合性是从右至左的,则连续的赋值运算是从右向左逐个计算赋值。在C语言中,要特别注意某些运算符因运算对象数据类型不同,可能有不同的意义。1.算术运算符算术运算符的运算对象是基本数据类型的数据,实现通常的取整、取负、四则运算、求两整数相除后的余数的运算和增1减1运算。特别要留心的是整除运算、求余运算、增1运算和减1运算。对两个整型数据执行除运算(/),称为整除运算,要特别注意的是两个整型数据的整除运算的结果是整型的,如表达式3/2的结果为1,表达式2/3的结果为0.求余运算符(%)要求参与运算的两个运算对象均为整型数据,如5%3的值为2.一般来说,求余运算所得结果的符号与被除数的符号相同。如-5%3的值为-2,5%-3的值为2.增1(++)和减1(——)运算符都是单目运算符,以整型、字符型和指针型变量为运算对象,并改变运算对象的值。按它们出现在变量之前和之后两种不同情况,其作用有微妙的差别。前缀++前缀++的一般形式是++变量例如,若X是整型或某种指针类型的变量,则++X使变量X的值增大1个单位,并以X的新值作为表达式“++X”的运算结果。如以下语句执行前,变量X的值为1,语句j=++x;使变量X的值变成3,变量j的值也为3.这里所说的一个“单位”是指:如果X是整型的,则++x就是普通的解释:“x的值比原值增加1”;x是指针,它指向数组的某个元素,则++x使它指向数组的后一个元素。后缀++后缀++的一般形式是变量++表达式“变量++”运算结果是该变量的原来值,在确定了表达式结果之后,用与前缀++相同的方式增大该变量的值1个单位。前缀++和后缀++都能使变量的值增加1个单位,但是它们所代表的表达式的值却不相同,前者是变量增加后的值,后者是变量还未增加的原先值。例如i,j为整型变量,且i的值为4,以下分别用?和?表记的代码将使j获得不同的值:?j=++i;?j=i++9都使变量i的值变为5,但?使j的值为5;?使j的值为4.前缀——前缀——的一般形式是——变量前缀——使变量的情减少(或后退)l个单位,并以变量的新值为表达式“——变量”的运算结果。后缀——后缀——的一般形式是变量——后缀——作用于变量时,以该变量的值作为表达式“变量——”的运算结果,即先取其值为结果,然后用与前缀——相同的方式减少该变量1个单位。后缀——与前缀——的区别类似于后缀++与前缀++的区别。类似前面的例子,依旧假定i的值为4,两代码?j=——i?j=i——都使变量i的值变为3,但?使j的值为3;?使j的值为4.使用++和——运算符时,其运算对象仅适用于变量,不能是常量等数据值表达式。如4++或(i+j)++都是不合法的。++和——是带有副作用的运算符。建议读者不要在一个表达式中对同一变量多次使用这样的运算符,可能会发生意想不到的结果。如i的值为4,对表达式(i++)+(i++)可能认为它的值为9(+5)。然而在TURBOC和MSC系统中,它的值为8.而表达式(++i)+(++i)的值为12.这是因为这些系统在处理i++时,先使用i的原值计算整个表达式,然后再让i连续两次自增;处理++i时,在计算表达式值之前,先对i执行两次自增,然后才计算表达式。放前一个表达式的值为8,后一个表达式的值为12.因+与++(-与——类似)是两个不同运算符,对于类似表达式i+++j会有不同的理解:(i++)+j或i+(++j)。C编译的处理方法是自左至右让尽可能多的字符组成一个合法的句法单位(如标识符、数字、运算符等)。因此,i+++j被解释成(i++)+j,而不是i+(++j)。10增1(++)和减1(——)运算符的结合方向是自右至左的。2.关系运算符用于关系运算的关系运算符有六个:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)和!=(不等)。关系运算是双目运算,它的运算对象可以是基本数据类型的数据,用于比较大小;或是指向同一个数组两元素的指针,用于比较前后关系。在高级语言中,习惯称条件满足为“真”,不满足为“假”。特别在C语言中约定:比较后,条件满足(真)的值为1;比较后,条件不满足(假)的值为儿用关系运算符将两个子表达式连接起来,构成关系比较表达式,求得结果为1(真)或0(假)。六个关系运算符中,运算符(<、<=、>、>=)的优先级高于运算符(==,!=)。如表达式X>y==C<d等价于表达式(X>y)==(C<d)。另外,为便于描述两个复杂算式的比较,关系运算符的优先级低于算术运算符的优先级。设有i=1,j=2,k=3,则表达式i>j的值为“假”,即表达式的值为0;表达式i==k>j的值为“真”,即表达式的值为1(先计算k>j,其值为1,等于i);i+j<k的值为“假”,即表达式的值为0.关系运算符的结合方向是自左至右。仍设i=1,j=2,k=3,则表达式k>j>i的值为0(先计算k>j,其值为1,再计算1>1,结果为0)。3.逻辑运算符用于逻辑运算的逻辑运算符有三个:&&(逻辑与)、||(逻辑或)、!(逻辑非)其中运算符“&&”和“||”是双目运算符,要求有两个整型或字符型的运算对象,用于连接多个判定条件,构成更复杂的条件判定;运算符“!”是单目运算符,用于描述对给定条件的否定判定。逻辑运算产生的结果也只能是1或0.1表示逻辑运算结果为“真”;用0表示运算结果为“假”。在判定一个运算对象的值为“真”或“假”时,以运算对象的值不等于零为“真”,运算对象的值等于0为“假”。逻辑运算符中,按优先级排列为:逻辑非运算符!的优先级高于逻辑与运算符&&,逻辑与运算符&&的优先级高于逻辑或运算符||.另外,&&和||的优先级低于关系运算符的优先级;!的优先级高于算术运算符的优先级。逻辑运算符||和&&的结合方向是自左至右,而逻辑运算符!的结合方向是自有至左。需要特别指出的是,“逻辑与”和“逻辑或”运算符分别有以下性质:a&&b,仅当a为0时,不管b为何值(实际上不再计算b),结果为0.a||b,仅当a为1时,不管b为何值(实际上不再计算b),结果为1.上述性质就是说,对于表达式a&&b,仅当子表达式a为非零时,才计算子表达式b;对于表达式a||b,仅当子表达式a为0时,才计算子表达式b.在具体编写程序时,也应利用以上性质。对于两11个条件的逻辑与,如当条件1不成立情况下,条件2的值没有意义或不可计算时,逻辑表达式应写成:条件l&&条件2避免在条件1不成立情况下,计算条件2.如有条件:y/x>2且x!=0,应写成:x!=0&&y/x>2当X为0时,不会计算y/X.而写成:y/X>2&&X!=0是不正确的,因为当X为0时,不能计算y/X.对于逻辑或也有类似情况。由于上述性质,在计算连续的逻辑与和逻辑或运算时,实际上不分优先级,而是顺序从左至右计算。在计算逻辑与运算时,若有左运算对象的值为0,则不再继续计算逻辑与运算,并立即以0为逻辑与运算的结果;在计算逻辑或运算时,若有左运算对象的值为1,则不再继续计算逻辑或运算,并立即以1为逻辑或运算的结果。在顺序计算逻辑表达式的过程中,一旦确定了表达式的最终结果,就不再继续计算。4.赋值运算符赋值运算的最简单形式是变量=表达式其中“=”是赋值运算符。赋值运算的执行过程是:(l)先计算赋值运算符右端的表达式;(2)如表达式的类型与赋值运算符左边的变量类型不同(仅限于基本类型),将表达式值的类型自动转换成变量的类型;(3)将求得的值赋给变量,即存储到由变量所占的内存中。简单地说,计算表达式的值,将该值赋给变量。赋值运算也有结果,经赋值运算后,赋值表达式具有赋值后赋位运算符左边变量同样的类型和值。因赋位运算有值,所以可以进一步参与运算,特别是可以再赋植给其它变量。赋值运算符的结合性是„边有至左“的,当连续有多个赋值运算时,则从右至左逐个赋值。如有变量定义:intk;doublex;则赋值表达式:x=k=3.5是先将实数3.5自动转换成整数3赋给整型变量k,然后又将整数3自动转换成实数3.0赋给实型变量X.所以,k的值是3,X的值是3.0.12在程序中,经常遇到在变量当前值的基础上作某种修正的运算。如x=x+5.0这类运算的特点是:变量既是运算对象,又是赋值对象。为避免对同一存储对象的地址重复计算,C语言弓队复合赋值运算符。它们是+=、-=、*=、%=、〈〈=、〉〉=、&=、^=、|=通常,记日为某个双目运算符,复合赋值运算xθ=e其等效的表达式为x=xθ(e)注意,当e是一个复杂表达式时,等效表达式的括号是必需的。如y*=a+b的等效表达式是y=y*(a+b)赋值运算符和所有复合赋值运算符的优先级全相同,并且都是“自右至左”结合,它们的优先级高于远号运算符的优先级,低于其它所有运算符的优先级。逗号运算符“,”用于将若干表达式连接起来顺序地逐个计算。连续返号运算的一般形式为:表达式1,表达式2,…,表达式n它的计算顺序是从左到右逐一计算各表达式,并以表达式n的值为连续逗号运算的结果。例如,表达式x=(i=3,i*2)使i等于3,X等于6.其实,逗号运算只是把多个表达式串联起来,在许多情况下,使用逗号运算的目的只是想分别计算各个表达式的值,而并非想使用逗号运算中最后那个表达式的值。逗号运算最常用于for结构中,用于给多个变量登初值,或用于对多个变量的值逐一修改等。逗号运算符的优先级最低,其结合性是“自左向右”的。条件运算是一个三目运算,有三个运算对象。条件运算的一般形式为表达式1?表达式2:表达式3条件运算的计算规则是:13(1)计算表达式1的值;(2)如果表达式1的值非0(真),则计算表达式2,并以表达式2的值为条件运算的结果(不再计算表达式3);(3)如果表达式1的值为0(假),则计算表达式3,并以表达式3的值为条件运算的结果(不再计算表达式2)。例如,表达式X>y?X:y如果x>y条件为真,则条件运算取x值,否则取y值。条件运算符(?:)的优先级高于赋值运算符,低于逻辑运算符,也低于关系运算符和算术运算符。例如,表达式max=X>y?X:y+l等效于表达式max=((x>y)?x:(y+l))条件运算符的结合性为“自右至左”。例如,表达式X>y?X:u>V?u:V等效于表达式X>y?X:(u>V?u:V)长度运算以字节为单位给出其运算对象所需(或所占)的字节数,运算对象可以是任何类型的数据对象或数据类型。它是根据对象的类型来确定对象(所需)的字节数的。长度运算有两种书写形式:sizeof变量名或sizeof(类型名)如果有某种类型为江的变量V,其中t可以是系统提供的类型或用户自己定义的类型,可以是简单的,也可以是数组、结构等。则sizeofV就是变量V所占的字节数。如有intj;doublex;表达式sizeofj和sizeOfx分别是变量j和x所占的字节数。sizeof(t)是系统为分配一个类型为t的数据对象所需的字节数。如sizeOf(int)和sizeof14(dou-ble)分别是系统为分配一个类型为int和double变量所需的字节数。位运算的运算对象只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位率信息,按位完成指定的运算,得到位串信息的结果。位运算符又可分成两类:一类是位逻辑运算符,另一类是位移位运算符。位逻辑运算符有:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)位移位运算有:<<(位左移)和>>(位右移)其中按位取反运算符是单目运算符。其余均为双位运算符。位逻辑运算符的优先级从高到低,依次为~、&、^、|、,其中的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符。位移位运算符的优先级低于算术运算符,高于关系运算符,它们的结合方向是自左至右。按位与运算符(&)按位与运算将将两个运算对象的对应位按位遵照以下规则进行计算:0&0=0,0&l=0,1&0=0,1&l=1即同为一的位,结果为1,否则结果为0.例如,设3的内部表示为00000011,5的内部表示为00000101,则3&5的结果为00000001按位与运算有两种典型用法。一是取一个位率信息的某几位,如以下代码截取。的最低7位、&0177t二是让某变量保留某几位,其余位设置成0,如以下代码让X只保留最低6位:x=X&077、以上用法都先要设计好一个常数,该常数只有需要的位是互,不需要的位是0.用它与指定的位串信息按位与。按位或运算符(|)按位或运算将两个运算对象的对应位按位遵照以下规则进行计算:0|0=0,0|l=1,1|0=l,1|1=1即只要有五个是1的位,结果为1,否则为0.例如,023|035结果为037.按位或运算的典型用法是将一个位串信息的某几位设置成1.如将要获得最右4位为1,其它位与变量j的其它位相同,可用逻辑或运算017|j.若要把这结果赋给变量j,可写成:j=017|j按位异或运算符(^)按位异或运算将两个运算对象的对应位按位遵照以下规则进行计算:0^0=0,0^1=l,l^0=l,1^l=0即相应位的值相同的,结果为0,不相同的结果为l.15例如,013^035的结果为026.异或运算的意思是求两个运算对象相应位值是否相异,相异的为1,相同的为0.按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017^j,就能求得j最右4位的信息的反,即原来为1的位,结果是0;原来为0的位,结果是1.按位取反运算符(~)按位取反运算是单目运算,用来求一个位串信息按位的反,即那些为0的位,结果是1;而那些为1的位,结果是几例如,~7的结果为0xfff8.取反运算常用来生成与系统实现无关的常数。如要将变量X最低6位置成0,其余位不变,可用代码X=X&~077实现。以上代码与整数X用2个字节还是用4个字节来实现无关。当两个长度不同的数据进行位运算时(例如long型数据与int型数据),将两个运算对象的右端对齐进行位运算。如果短的数为正数,高位用0补满;如果短的数为负数,高位用1补满。如果短的为无符号整数,则高位总是用0补满。位运算用来对位串信息进行运算,得到位串信息结果。如以下代码能取整型变量k的位串信息的最右边为亚的信息位:((k-l)^k)&k.位左移运算符(<<)位左移运算符用来将左运算对象(整型或字符型数据)作为二进位信息串作整体向左移动,移动的位数由右运算对象指定,右端空出的位用0补充,得到新的位申信息。例如014<<2,结果为060,即48.位右移运算符(>>)位右移运算将一个位串信息向右移指定的位,右端移出的位的信息被丢弃。例如12>>2,结果为3.与左移相反,对于小整数,每右移1位,相当于除以人在右移时,需要注意符号位问题。对无符号数据,右移时,左端空出的位用0补充。对于带符号的数据,如果移位前符号位为刚正数),则左端也是用0补充;如果移位前符号位为1(负数),则左端用0或用1补充,这取决于计算机系统。对于负数右移,称用0补充的系统为“逻辑右移”,用1补充的系统为“算术右移”。以下代码能说明读者上机的系统所采用的右移方法:printf(“%d\n\n\n”,-2>>4);者输出结果为一l,是采用算术右移;输出结果为一个大整数,则为逻辑右移。2.5表达式表达式就是将运算符与运算对象连接起来描述计算的式予。按表达式的构成规则分,表达式可分以下几类:初等量表达式是常量、变量、字符串、函数调用、数组元素、结构成分和带圆括号的表达式等。单目运算表达式是由单目运算符和一个运算对象构成的表达式。单目运算符的优先级低于初等量的运算符,它们的结合性都是“自有向左”结合。16双目运算表达式的一般形式为表达式双目运算符表达式双目运算符自左向右结合。按双目运算符分类,又可分算术表达式、关系表达式、逻辑表达式、赋值表达式和远号表达式。由于C语言没有特别的真、假值,判定时,以非0值为真,以0值为假。所以,前述的C语言的各种表达式的计算结果都可作为逻辑值。条件运算表达式的一般形式为表达式?表达式:表达式条件运算符自右向左结合。2.6数据类型转换C语言允许基本数据类型中的不同类型数据进行混合运算。因不同类型的数据所占内存字节数和其内部表示形式的不同,在算术运算中(其它运算例外)一个运算符所涉及到的各运算对象,能根据运算对象的情况,要求运算对象的值从一种类型转换成另一种类型。这种类型转换是自动进行的,称作隐式类型转换。隐式类型转换严格遵守以下规则,按所列优先顺序实行类型转换。(1)如有运算对象是longdouble型的,则其余运算对象也转换成longdoube型。(2)如有运算对象是double型的,则其余运算对象也转换成double型。(3)如有运算对象是float型的,则其余运算对象也转换成float型。(4)如有运算对象是unsignedlongint型的,则其余运算对象也转换成unsignedlongint型。(5)如有运算对象是longint型的,则其余运算对象也转换成longint型。(6)如有运算对象是unsignedint型的,则其余运算对象都转换成unsignedint型。(7)最后,运算对象和结果都是int型的。根据最后一条规则,两个char型和short型运算对象都自动转换成int型参与运算,并且结果是int型的。算术运算中,基本数据类型的混合运算会发生隐式类型转换,当要求与隐式类型转换规则不一17致时,可在表达式中用显式类型转换运算,强制地将一种类型的表达式值转换成另一种类型的位。显式类型转换的书写形式为(类型名)表达式其中(类型名)是对其后的表达式作强制类型转换运算,它将表达式的值强制地转换成类型名所指明的类型。例如,库函数sqrt()是求一个double型值的平方根。为求整型变量m的平方根,正确的写法是sqrt((double)m)在求m的平方根之前,先将m的值强制地转换成double型,然后去调用函数sqrt()。类型转换不只改变表达式的值的类型,也可能会因两种表示形式上的差异,值的大小会有一些误差3.1顺序结构顺序结构用来描述一个计算或操作序列,表示从序列的第一个计算开始,顺序执行序列中的每个计算,直至序列的最后一个计算。通常,一个复杂的计算过程不能用一个简单的计算来表达,而需把复杂的计算描述成简单计算的序列。在C语言中,将顺序执行的语句序列,用花括号括起来,构成C语言的复合语句。在逻辑上视复合语句为单个语句,它也能用作其它结构语句的成分语句。在很多场合,复合语句内还会包含其它结构语句。在顺序结构中,最频繁使用的是表达式之后接上一个分号。例如,在赋值表达式之后接上分号,完成用表达式的值更新某变量,习惯称这种表达式语句为赋值语句;在函数调用之后接上分号,完成指定的计算功能,习惯称这种表达式语句为函数调用语句。最基本的输入输出库函数有字符输入函数、字符输出函数、格式输入函数和格式输出函数。字符输入函数getchar()的功能是从标准输入设备上(通常是键盘终端)读取一个字符。该函数没有参数,对它的每次调用,就返回下一个输入字符的ASCII代码值。例如,执行语句ch=getchar();使变量ch得到输入字符的ASCII代码值。一般情况下,这里的变量ch为char型或int型。当程序在输入字符后,用ch判定输入文件是否结束时,变量ch必须是int型的。这是因为文件结束标记值是-1,是int型的。程序中常用EOF表示当前读人字符是文件结束标记,常量名EOF在文件Stdio.h中被定义为-1.18字符输出函数ptuchar()有一个字符的ASCII代码值参数,函数调用putchar(ch)的功能是将以出值为其ASCII代码的字符输出到标准输出设备(通常是终端显示屏)上。这里ch可以是char型或int型数据。格式输入函数scanf()的作用是从标准设备读人字符序列,按格式控制字符率所包含的格式解释输入字符序列,并将解释结果存储到对应的变量中。调用格式输入函数scanf()的一般形式为scanf(格式控制字符串,变量地址,变量地址,……)格式控制字符串是字符串表达式,通常是由一对双引号括起来的字符串常量,直接用于解释输入字符序列。格式控制字符率可以包含:?空白类字符(空格符或制表符),它们使输入跳过空白类字符,直到遇到下一个非空白类字符。?普通字符(不包括%),它们要求输入字符流中下一个字符与它相同。?格式转换说明,以字符„%?开头至输入格式符结束的字符序列组成。格式转换说明引导对下一输入字符段进行转换。格式转换说明的一般形式为%[*][w][h/l/L]输入格式符输入格式符共有14个,有12种不同输入格式,其中大纲要求掌握的7种输入格式符的意义见表3.1.用方括号括住的内容是输入格式修饰说明,可以缺省,它们的意义是:(1)*——星号(赋值抑制符),对应的输入数据项按格式要求被输入,但结果不存储。带星号的格式转换说明不对应变量地址。用它来跳过一个输入数据项。(2)——整型常数(域宽说明),表示输入数据项的字符段的有效字符数。若实际输入字符段的字符数小于W,以实际有效字符为准。对于数值数据输入格式来说,输入域定义为从下一个非空白类字符起(因此可能跳过若干个空格符、制表符、换行符),到一个与数值数据相矛盾的字符,或直到输入了指定个数的字符数;对于字符率输入格式来说,输入域定义为从下一个非空白类字符起,输入非空白类字符,直至遇到空白类字符,或直到输入了指定个数的非空白字符。(3)h/l/L长度修饰符,指明输入数据项的存储类型。h修饰格式符d,o,X时,表示输入的整数按短整型存储。l修饰格式符d,O,X时,表示输入的整数按长整型存储。l修饰格式符e,f时,表示输入的实数按double型存储。19缺省时,对于格式符d,o,x,表示输入的整数按int整型存储;对于格式符e,f,表示输入的实数是按float型存储。表3.l常用输入格式符表格式符意义d输入十进制形式的整型数据O以人进制形式输入整型数据X以十六进制形式输入整型数据C输入字符数据S输入字符串e,f输入实型数据说明:(1)格式控制字符率之后给出的是变量地址,而不是变量名(除非是指针)。如要为整型变量n输入数据,写成scanf(“%d",n)是不正确的,应写成scanf(”%d“,&n)(2)如果在格式控制字符串中除格式转换说明和空白符之外,还有其它字符,则在输入数据时应输入与这些字符相同的字符。例如,scanf(“%d,%d„?,&i,&j)则在为i,j输入数据时,紧接在第一个整型数据之后,需要有一个逗号字符,如输入1,2是正确的;而输入12等其它形式都是不正确的。(3)在用“%c”格式转换说明输入字符时,空白类字符和用转义字符表示的字符都能作为有效字符输入。要输入一串空白类字符之后的第一个非空白类字符,可采用格式“%C”。格式字符率中的空格符使输入跳过空白类字符到第一个非空白类字符,然后被C格式输入。(4)为整型变量输入整数时,若变量类型为短整型,则必须在格式符之前加长度修饰说明h;若变量类型为长整型,则必须在格式符之前加长度修饰说明1.(5)输入数值数据时,输入字符流中的前导空白类字符会被自动跳过,从空白类字符后的数值20数据字符开始输入。构成数值数据的字符被输入转换成计算机的内部表示,并存储结果。若第一个非空白类字符不能构成数值字符,则立即结束输入。(6)S格式用来输入字符串,对应的变量地址为字符列表(数组)的首地址,该数组必须大到足以容纳可能输入的最长字符串。在输入字符流中,跳过前导的空白类字符,以非空白类字符开始,以后随的第一个空白类字符结束的非空白类字符的字符序列作为一个字符串。scanf()函数在输入的字符序列之后自动添加字符率结束标记符'\0'(因此,存储输入字符序列的字符数组的长度必须比实际最长字符串的字符数多1)。(7)e,f格式用未输入实数,对应的数据存储地址为实型数据存储地址。如格式转换说明中含有长度修饰说明1,则为double型变量地址;若无长度修饰说明,则为float型变量地址。输入数据的字符序列是由正负号(可有可无)、十进制数字串、带小数点的小数部分(可有可无)。以e或E开头的指数部分(可有可无)组成。(8)在跳过前导空白符后,正在输入数值数据和字符串时,遇以下情况,就认为该数据结束:?遇空白类字符:空白符、制表符、换行符。?已读人由有效字符数所指定的字符数。如“%4d多至4个数字符。?对于输入数值数据,下一个字符不能构成正确的数据格式。如scanf(“%d%C%f,&i,&c,&x)假定变量i,c,x分别为int型、char型和float型。若输入字符列为:123a123x.26则变量i为123,变量c为字符a,变量x为123.0.(9)输入数据时,将字符流转换成内部表示后,存储到对应变量中。例如,scanf(“%3d%*4d%d”,&i,&j)如输入字符行为12345678将使变量i=123,j=78.其中数据456因赋值抑制符*的作用被跳过。一般从键盘读入数据,不指定输入数据项的有效字符数,数据项与数据项之间用空白符,或制表符,或回车符分隔。格式输出函数printf()的作用是将输出项接指定的格式排版输出到标准设备上(通常是终端显示屏)。调用printf()函数的一般形式为printf(格式控制字符串,表达式,表达式,……)21其中格式控制字符率是字符串表达式,通常是由用一对双引号括起来的字符串常量。它包含三类字符:普通字符、转义字符和格式转换说明,它们的作用分别如下:(l)普通字符,要求按原样输出。(2)转义字符,要求技转义字符的意义输出,如„\n?,表示输出时回车换行,„\b?表示退格等。(3)格式转换说明,以字符%开头至格式符结束的字符列组成,其一般形式为%[-」「+」「」[#」「W][。p][h/l/L]输出格式符其中用方括号括住的内容是格式修饰说明,可以缺省(不出现),如“%d”、“%7.5f”等。每个格式转换说明对应一个输出项,输出项可以是常量、变量或表达式。格式转换说明的作用是将对应输出项的内容按格式符要求产生出字符列,并按格式修饰说明排版输出。输出格式符共有16个,有12种不同的格式,考试大纲只要求掌握表3.2所列的九种。3.2常用输出格式符表格式符意义d或i整型数据以十进制形式输出o无符号整型数据以八进制形式输出X无符号整型数据以十六进制形式输出U元符号整型数据以十进制形式输出C字符的ASCll码数据,输出对应的字符S输出字符串f以“整数部分。小数部分”形式输出实型数据e以[-]n.nnnnne?xx输出实型数据g以f或e格式输出说明:(1)x格式符同。格式符一样,把符号位作为数的一部分输出。对于x格式,用字符a、b、c、d、e、f(或A、B、C、D、E、F)表示9之后的六个十六进制数字符。(2)一个整数,只要它的位在0-255范围内,也可以用字符形式输出,输出以该整数为ASCII代码的字符。反之,一个字符数据也可以用整数形式输出,输出该字符的ASCII代码值。(3)f、e和g格式符用于输出实型数据,格式转换时有四舍五人处理。对于f格式,小数点后的数字个数可由格式修饰说明p指定,若p为0,不显示小数点。用e格式输出时,对于非0实数,小数点22前有一位非零数字,输出格式中的有效位数可由格式修饰说明p指定;字符e(或E)之后是指数,指数部分至少包含两个数字。若输出值的绝对值不小于1E+100,则指数部分多于两位数字。g格式能根据表示数据所需字符的多少自动选择f格式或e(或E)格式输出实数,选择是以输出时所需字符数多少为标准。格式修饰说明有七种,教材只介绍其中四种,它们的意义分别说明如下:(1)W域宽说明,W是一个十进制整数,表示输出字段的字符数。若转换后需要的字符个数比给出的W多,则以实际需要为准;若转换后需要的字符数比W少,就在左边用填充字符补足(若给出左边对齐标志(-),则在右边补填充字符人通常用空白符作填充字符,若十进制整数W之前有前导0(此0不表示以八进制数给出字段宽度),则以字符0作填充字符。(2)-左对齐标志,当转换后字符个数少于W时,在W所限定的字段宽度内,转换所得字符列左对齐,右边补填充符。缺省时,右对齐,左边补填充符。(3)。p,其中p也是十进制整数。对于g或e格式输出,p指明输出精度(有效数字位数),可以缺省,缺省值依赖于系统的规定(下面的例子设p的缺省值为6)。对于f格式输出,p指明输出字符列的小数点之后的数字个数,可以缺省。对于S格式输出,p指明最多输出字符率的前p个字符,多余截断。缺省时,字符串的内容全部输出。对于d.i、O、u、x和X,表示至少出现的数字个数。同域宽说明一样,p也可以是字符*,而实际值由后面一个输出项的整数值给出,若该值为负值,相当于没有给出p.(4)l指明输出项的类型。长度修饰符l用于格式符d、i、o、u、X,表示对应的输出项是长整型或无符号长整型。以下是格式输出的一些例子。例如,inti=1234;longj=1234567L;printf(“%d,%+6d,%06d,%-6d,%5ld”,i,i,i,i,j)将输出:1234,+1234,00l234,1234,1234567注意:对于long型数据输出,必须在格式符之前有长度修饰符l,表明输出long型数据。若intk=045;longp=-1L;printf(“%#o,%4o,%6lo”,k,k,p)23将输出:045,45,37777777777而printf(“%#x,%4x,%6lx”,k,k,p)将输出:0x25,25,FFFFFFFF若unsignedintu=65535u;prinif(“%d,%4u,%ln„,u,u,p)将输出:-l,65535,4294967295若charch1=045,ch2=„a?;printf(“%c,%-3c,%2c”,ch1,ch2,ch2)将输出:%,a,a若chars[]==“ABCDEF„;printf(”%3s,%4.2s,%-7.4s,%.5s“,s,s,s,s)将输出:ABCDEF,AB,ABCD,ABCDE若floatf=123.4567f;doubled=123.456789;printf(“%。4f,%8.3f,%-7.2f,%。7f”,f,f,f,d)将输出:123.4567,123.457,123.46,123.4567890而printf(“%。6e,%10.2e,%-10.2e,%.2e,%.9e”,f,f,f,f,d)将输出:1.23457e+02,1.2e+02,1.2e+02,l.2e+02,1.23456789e+02注意:实型数据的有效位数,不要以为凡是打印(显示)的数字都是准确的。一般地,float型只有7位有效数字,double型有15位有效数字。实际上,因计算过程中的误差积累,通常不能达到所说的有效位数。另外,要注意%g格式的特殊性,当它选择“整数部分。小数部分”形式时,因格式修饰说明。p在e格式中的意义是指明精度,所以p的值是整数部分位数与小数部分位数之和(不是f格式中的小数位数)。如有24floatg1=12.34f,g2=0.0f;doubled=123.456789,g=123456.789;printf(“%g,%G”,g1,g2);printf(“%f,%g,%g,%g,%.8g”„,g1,g1,d,g,g)将输出:12.34,012.340000,12.34,123.457,123457,123456.793.3选择结构选择结构有单分支选择结构、双分支选择结构和多分支选择结构。C语言提供相应的if语句和switCh语句分别用来描述这些选择结构。单分支选择语句有以下形式:if(表达式)语句这种形式的语句执行过程是:(l)计算表达式的值;(2)测试表达式的值。若表达式的值非0,则执行它的成分语句,并结束单分支选择的执行;若表达式的值为0,则立即结束单分支选择的执行。汉分支选择语句有以下形式:if(表达式)语句1else语句2双分支选择语句根据给定的选择条件表达式值为非0或为0两种情况,从两个供选择的成分语句中自动选取一个成分语句执行。双分支选择语句的执行过程是:25(1)计算表达式的值;(2)测试表达式的值并选择执行语句。若表达式的值非0,则执行语句1,并结束双分支选择语句;否则执行语句2,并结束双分支选择语句。注意;无论条件表达式的值为何值,只能执行语句1或语句2中的一个。当双分文选择语句中的else之后的语句2为空语句时,就变成单分支选择语句。单分文选择语句和双分支选择语句统称且语句。在if语句中的语句、语句1和语句2可以是任何语句。当它们中的某一个需用语句序列描述时,必须将这语句序列写成复合语句。当它们中的某一个又是if语句时,就呈现嵌套的if语句形式。这时应注意else与if的对应关系。C语言约定else总是与它前面最接近的if对应。为正确书写if语句,特别说明以下几点:(1)若if语句中的语句、语句1、语句2是一个简单语句,则这些简单语句之后会有一个分号,这是C语言对这些简单语句的要求。(2)若if语句中的语句、语句l、语句2要用语句序列(即为顺序结构)来实现,则必须将它们改写成复合语句,即逻辑上把它们变成一个语句。(3)在if语句中,每个else总要与它前面的if对应,不可能出现没有对应if的else.3.多分支选择语句多分支选择结构通常有n(>2)个不同情况和n+1个供选择的分支。多分支选择结构也可用前叙述的嵌套if语句来描述,但因if语句嵌套深度太多不便于程序编写,也不便于理解,为此C语言专门提供了一种实现多分支选择结构的语句,这就是switCh语句。它的一般形式是:。switeh(表达式){case常量表达式1:语句序列1case常量表达式1:语句序列2case常量表达式n:语句序列ndefalt:语句序列n+1}对switeh语句需说明以下几点:(1)switch后面括号内的表达式只限于是整型表达式或字符型表达式或枚举型表达式。(2)case后的常量表达式称为情况前缀,要求所有常量表达式的值互不相同,并与switch后面括号内的表达式值的类型相一致。(3)语句序列由任意条合法的C语句构成,也可以没有语句。26(4)情况前缀default可以缺省,但至多出现一次,习惯总是将它写在全部情况前缀之后,如有必要也可写在某case之前。switch语句的执行过程解释如下:先计算表达式的值,以该值依次与各case之后的常量表达式的值比较,按下列规则,选择执行的入口:如果表达式的值等于某个常量表达式的值,switch语句就从该常量表达式之后的语句序列的第一个语句开始执行,然后一直向下执行,或自动依次进入后继常量表达式之后的语句序列继续执行(如没有break语句),或执行完语句序列n+1,结束switch语句的执行;或在执行某个语句序列过程中遇到转出该switch语句的语句(如break语句),就停止向下执行,结束switch语句的执行。如果没有相匹配的常量表达式,就从以default为情况前缀的语句序列开始执行。如果没有相匹配的常量表达式,也没有defaul情况前缀,则该switch语句的这次执行立即结束。由上述解释可知,“case常量表达式”只是起语句序列入口的作用。在执行switch语句时,根据switch之后的表达式的值找到与该值匹配的入口,就从此人口处开始执行,只要未遇到转出该switch语句的break语句或goto语句,就一直向下执行,也不再理会经过的case后的常量表达式。如果要使各种情况互相排斥,仅执行各case所对应的语句序列,最常用的办法是使用break语句,各语句序列都以break语句结束。在switch语句中,执行break语句将使控制转向switch语句的后继语句。由于switch语句的表达式不允许是实型的,当应用于实型值选择情况时,通常需作以下处理:将实表达式乘上一个适当的比例因子,使较大的实表达式值映照到一个较小的范围上,然后再将它转换到整型。3.4循环结构循环计算用循环结构来描述。C语言提供三种描述不同循环结构的语句,它们是while语句、do-while语句和for语句。1.while语句while语句用来描述while型循环结构,它的一般形式为while(表达式)语句while语句的执行过程是:(1)计算while之后的表达式的值;(2)测试表达式的值,当值为非0时,转步骤3;如值为0,则结束while语句;27(3)执行while语句的循环体,并转步骤1(从而构成循环)。一般来说,为使while语句的执行能正常结束,如控制循环的条件表达式包含有变量,循环体的执行应能更新这些变量的值,使表达式的值会变为0.有时,很难直接写出while后的条件,这时可以简单地写上1,而在循环体中含有当某条件满足时,执行如break语句那样的控制转移语句,使控制跳出while循环,即呈以下结构形式:while(1){……if(表达式)break;……}:2.do-while语句do-while语句用来描述do-while型循环结构,它的一般形式为;do语句while(表达式);其中的语句是do-while语句的循环体。do-while语句的执行过程是:(1)执行do-while语句的循环体;(2)求while之后的表达式的值;(3)测试表达式的值,当值为非0,转步骤1(从而构成循环);如值为0,则结束do-while语句。与while语句一样,当循环体由多个语句组成时,必须把它们书写成复合语句。有些用while语句描述的循环计算,也能用do-while语句描述。然而,并非总是如此。两者的重要区别在于:执行循环体时,对作为循环条件的表达式的求值和测试的时间不同。while语句对作为循环条件的表达式求值和测试在执行循环体之前,而do-While语句对作为循环条件的表达式求值和测试在执行循环体之后。对于do-while语句,它的循环体至少被执行一次,而while语句的循环体在作为循环条件的表达式值一开始就为0的情况下,就一次也未被执行。如能保证while语句中的作为循环条件的表达式在第一次被求值后,总是非0,则把该循环条件移至循环体执行之后求值和测试,能起同样的控制作用。在这种情况下,while语句就能改写成如while语句。如while语句中的作为循环条件的表达式值可能初次求值就为0时,则它不能简单地改写成do-while语句。另外要特别指出,分号是do-while语句的结束符,不能省略。3.for语句for语句是C语言中最灵活、使用最广泛的循环结构语句。如以最一般意义下考虑循环,一个完整的循环应包含对有关变量赋初值部分、控制循环的条件、一个要循环计算的操作、每次循环后对28有关变量的修正等四部分组成。拉语句就是从这一般意义下表达循环结构的语句。for语句的一般形式为for(表达式1;表达式2;表达式3)语句其中的语句是for语句的循环体。输语句的执行过程是:(1)计算表达式1;(2)计算表达式2的值,并测试其值为0或非0.若值为非0,转步骤3;否则结束for语句;(3)执行循环体;(4)计算表达式3;(5)转向步骤2.for语句的一般形式也可等价地用以下形式的while语句来表达:表达式1;while(表达式2){语句表达式3;}由for语句的执行过程可知,for语句的表达式1的作用是对控制循环的有关变量赋初值;表达式2是控制循环的条件;表达式3用于修正有关变量;语句是循环体。所以for语句按各部分的功能,可以形象地写成以下形式:for(赋初值的表达式;控制循环条件的表达式;修正变量的表达式)完成循环计算的语句正确使用for语句,需注意以下几种情况:(1)for语句的一般形式中,表达式1、表达式2和表达式3都可以省略。如表达式1省略,表示该for语句没有赋初值部分,或前面的程序段已为有关变量赋了初值,或确实没有特别的初值;如表达式2省略,表示循环条件永远为真,可能循环体内有控制转移语句转出缺语句;表达式3省略,表示没有修正部分,对变量的修正已在循环体内一起完成。不管表达式1、表达式2和表达式3省略情况如何,其中两个分号都不能省略。对于三个表达式都省略情况,for语句呈以下形式:for(;;)29语句(2)表达式l、表达式2和表达式3都可包含逗号运算符由多个表达式组成。4.break语句break语句除能用于switch语句外,还常用于循环语句中。执行循环结构中的break语句,控制就从包含它的循环结构中退出。break语句通常与if语句结合,构成一个结束循环的条件。5.continue语句continue语句只用于循环语句中。通常复杂的循环计算中,循环语句的循环体是一个语句序列,中间会有一个包含continue语句的且语句。当指定的条件成立时,continue语句就被执行,这时continue语句之后的语句就不再执行,控制立即进入下一轮循环。6.语句标号和goto语句C程序的语句之前都可插入标识符和冒号,该标识符即为其后语句的标号。如strat:X=0;标识符Start就是语句“x=0;”的标号。goto语句(goto标号;)是一种无条件转移语句,其意义是将程序的控制转到以所指定的标号命名的语句处。goto语句通常出现在if语句内,实现当某种条件出现时,需要改变正常的顺序执行控制流程。由于goto语句过份的随意使用会给程序的理解带来很大的困难,所以一般强调不使用goto语句来编程。只有当一个多重循环的最内层,当发现某种特别的情况需要结束整个多重循环,这时可用goto语句让程序执行从最内层直接转到外层循环之外。注意,break语句只能跳出包含它的一层循环。7.用goto语句构成循环在早先非结构化程序设计中,由于语言提供的控制结构的结构性差,常用goto语句构成循环。但在结构化程序中,不再用goto语句构成循环。考生掌握这个知识是要求考生能将goto语句构成的循环改写成结构化控制结构描述的循环。4.1一维数组1.数组的基本概念数组是一组同类对象集合的一种表示。在C语言中,数组类型是这样一种数据结构:数组所有元素的数据类型相同,元素个数固定,其元素按顺序存放,每个元素对应一个序号(称为下标),数组元素的下标从0开始顺序编号,各元素按下标存取(引用)。数组元素变量能与相同类型的独立的变量一样使用。引用数组元素变量所需的下标个数由数组的维数决定,数组有一维数组、二维数组或多维数组之分。2.一线数组的定义30一维数组的定义形式为类型说明符数组名[常量表达式」;例如inta[5];定义一个名为a的数组,它有五个元素,每个元素都是整型。数组定义包含以下几个要点:(l)类型说明符用来指明数组元素的类型,同一数组的诸元素,它们的类型是相同的。(2)数组是一个变量,与一般变量一样,用标识符命名,数组名遵守标识符的命名规则。(3)方括号“[]”是数组的标志,方括号中的常量表达式的值表示数组的元素个数,即数组的长度。例如,inta[5]中的5表示数组a有5个元素,下标从0开始,这五个元素分别是:a[0]、a[1]、a[2]、a[3]和a[4].(4)常量表达式通常是整型常量、符号常量或sizeof(类型名),以及由它们组成的常量表达式。定义数组大小用常量表达式,就是说数组的大小是固定的,不可以包含引用变量值的表达式来定义数组的大小。(5)C语言有一个约定,当数组名单独出现在表达式中时,数组名可以代表为它分配的内存区域的开始地址,即数组中下标为0的元素的地址。在这种情况下,数组名起着一个常量的作用,即a与&a[0]作用一样。如代码scanf(“%d”,&a[0])与scanf(“%d”,a)都是为数组a的第一个元素输入值。3.一维数组的初始化可在数组定义同时,给出数组元素的初值。这种表述形式称为数组初始化。数组初始化可用以下几种方法实现:(l)数组定义时,顺序列出数组全部元素的初值。例如,intd[5]={0,l,2,3,4};将数组元素的初值依次写在一对花括弧内。经上面定义和初始化之后,就有d[0]=0.d[l]=l、d[2]=2、d[3]=3、d[4]=4.(2)只给数组的前面一部分元素设定初值。例如,inte[5]={0,l,2};定义数组e有5个整型元素,其中前三个元素设定了初值,而后两个元素末明确地设定初值。系统约定,当一个数组的部分元素被设定初值后,对于元素为数值型的数组,那些末明确设定初值的元素自动被设定0值。所以数组e的后两个元素的初值为0.但是,当定义数组时,如未对它的元素指定过初值,对于内

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论