手机苹果屏幕出现黑圆圈上出现一个圆圈。不是悬浮球。怎么都不会移动。

当前位置: >>
高级语言程序设计(一)复习资料
1.程序从最一般的意义来说,程序是对解决某个计算问题的方法(算法)步骤的一种描述;而从计 算机来说,计算机程序是用某种计算机能理解并执行的计算机语言作为描述语言,对解决问题的 方法步骤的描述。计算机执行按程序所描述的方法步骤,能完成指定的功能。所以,程序就是供 计算机执行后能完成特定功能的指令序列。一个计算机程序主要描述两部分内容:
描述问题的每个对象和对象之间的关系,以及描述对 这些对象作处理的处理规则。其中关于对象及对象之间的关系是数据结构的内容,而处理规则是 求解的算法。 针对问题所涉及的对象和要完成的处理, 设计合理的数据结构常可有效地简化算法, 数据结构和算法是程序最主要的两个方面。2.程序设计的任条和主要步骤程序设计的任务就是分析解决问题的方法步骤 (算法) 并将解决问题算法的方法步骤用计算 , 机语言记录下来。程序设计的主要步骤包括:认识问题、设计解决问题的算法、按算法编写程序、 调试和测试程序。在程序开发过程中,上述步骤可能有反复,如发现程序有错,严重情况可能会 要求重新认识问题和重新设计算法等。3.机器语言和汇编语言计算机能直接识别和执行的二进制代码称为计算机的机器语言。用有助于记忆的符号来代表 二进制代码,称为汇编语言。汇编语言与机器语言几乎有一对一的关系。用汇编语言编写的程序 称为“汇编源程序” ,汇编源程序不能在计算机上直接执行,需要用汇编程序将汇编源程序翻译成 机器语言程序,然后执行由汇编程序翻译出来的机器语言程序。机器语言和汇编语言是与具体计 算机紧密相关的,称它们是面向机器的语言。4.高级语言与机器语言和汇编语言相比较,高级语言与具体计算机无关,是一种能方便描述算法过程的 计算机程序设计语言。高级语言种类千差万别,但一般包含有以下四种成分:数据成分用来描述 程序所涉及的数据;运算成分用来描述运算;控制成分用来表达程序的控制构造;传输成分用来 表达数据的传输。 由于高级语言程序主要是描述计算机的解题过程, 即描述复杂的加工处理过程, 所以也称这种高级语言为面向过程语言。 用高级语言编写的程序称为“源程序” 。计算机不能直接技源程序的语句运行,通常有解释方 式和编译方式两种方法在计算机上执行源程序。解释方式,即让计算机运行解释程序,解释程序逐句取出源程序中的语句,对它作解释执行, 输入数据,产生结果。编译方式,即先运行编译程序,从源程序一次翻译产生计算机可直接执行的二进制程序(称 为目标程序) ;然后让计算机执行目标程序,输入数据,产生结果。解释方式的主要优点是计算机与人的交互性好,调试程序时,能一边执行一边直接改错,能 较快得到一个正确的程序。缺点是逐句解释执行,运行速度慢。编译方式的主要优点是计算机运行目标程序快,缺点是修改源程序后必须重新编译以产生新 的目标程序。现在也有将上述两种方式结合起来的,即先编译源程序,产生计算机还是不能直接执行的中 间代码,然后让解释程序解释执行中间代码。这样做的好处首先是比直接解释执行快;更大的好 处是中间代码独立于计算机,只要有相应的解释程序,就可在任何计算机上运行。5.面向问题语言面向问题语言是为了易于描述和求解某类特定领域的问题而专门设计的一种非过程语言。用 面向问题语言解题时,不仅摆脱计算机的内部逻辑,也不必关心问题的求解算法和求解的过程, 只需指出问题是做什么,数据的输入和输出形式,就能由相应的计算机系统得到所需结果。如报 表语言、SOL(Structured Query Language)语言等。SQL 语言是数据库查询和操纵语言,能直 接使用数据库管理系统。由于使用面向问题语言来解题只要告诉计算机做什么,不必告诉计算机 如何做,能方便用户的使用和提高程序的开发速度。但实现面向问题语言的系统从最一般的意义 下实现问题如何求解,通常实现的效率较低。另外,面向问题语言要求问题已有通用的求解方法, 目前其应用范围还比较狭窄。1.2 C 语言基础1.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 函数的定 义主要分两部分:函数说明部分和函数体。其中函数体由 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” 。(2)特殊符号。主要是运算符。(3)保留字。在程序或语句中是用来表示特定语法含义的英文单词。(4)标识符。用于命名程序对象,如变量、常量、函数、标号等。在 C 语言中,一个合理 的标识符由英文字母或下线符开头,后跟或不跟由字母、下线符、数字符组成的字符列。~般以 下线符开头的标识符作为系统内部使用。利用基本词汇,按照给定的 C 语言的句法规则就可命名程序对象,描述表达式计算、构造语 句、函数,直至整个程序。回复 举报飘过 0 砸 0 顶 0 2楼路漫漫 发表于
11:00:192.1 C 语言的数据类型数据类型包含两方面的内容:数据的表示和对数据加工的操作。数据的全部可能表示构成数 据类型的值的集合。数据全部合理的操作构成数据类型的操作集合。在 C 语言中,把整型、实型和字符型称为基本数据类型,又称整型和实型为数值型。为了描 述更复杂的数据结构,C 语言还有构造类型、指针类型、放举类型和空类型。构造类型是指由若 干个相关的数据组合在一起形成的一种复杂数据类型。1.整型 整型数据按其存储在内存中的二进位信息的最高位是当作数值信息位还是当作数据的符号 位,将整型数据分成带符号整型和无符号整型两种。每种整型又按所需的字节个数的多少分成三 种。所以整型共有 6 种:带符号整型(int) 、带符号短整型(short int) 、带符号长整型(long int,或 long) 、无符号 整型(unsigned int) 、无符号短整型(unsigned short int)以无符号长整型(unsigned long) 。2.实型实型数据有表示范围和精度两个不同的特征,为了适应数的范围和精度的不同要求,实型数 据分三种类型:单精度型(也称浮点型 float) 、双精度型(double) 、长双精度型(long double)3.构造类型构造类型是指由若干个相关的数据组合在一起形成的一种复杂数据类型,构造数据类型的成 分数据可以是基本数据类型的,也可以是别的构造类型的。按构造方式和构造要求区分,构造类 型主要有数组类型、结构类型和共用类型。数组类型是由相同类型的数据组成;结构类型可以由 不同类型的数据组成;当不同数据类型不会同时使用时,以节约内存,让不同数据占用同一区域, 这就是共用类型。4.指针类型指针类型是取程序对象(如变量)在内存中占居的地址为值的一种特殊的数据类型。5.枚举类型当变量只取很少几种可能的值,并分别用标识符对值命名时,这种变量的数据类型可用枚举 类型来表示。如变量表示一个星期中的某一天,就可用校举类型描述该变量的类型,并以星期见 的英文名对日期命名,对应的变量取某日的星期名称为其值。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,其中六个英文字母也可以小写。例如,0x12 3 表示十六进制整数,其值等于十进制整数 1*16*16+2*16+3=291; oxabc,其值等于 10*16*16 +11+16+12=2748.整型常量也可在整数之后接上字母 L(或 l) ,特别指明它是 long 型的。整型常量也可在整数之后接上字母 U(或 u) ,特别指明是不带符号的,即是 unsigned 型的。 为指明不带符号的 long 型整型常量,则需在整数之后同时加上字母 U 和 L,表明该整型常量是 u nsigned long 型的。整型数据以二进制形式存放,要求短整型数据的字节数不能大于整型数据的字节数;整型数 据的字节数不能大于长整型数据的字节数。对于带符号的整数,用二进制代码的最左二进位作为 数的符号,1 表示负数,0 表示正数。2.实型常量 C 语言实型常量的一般书写格式是:正负号 整数部分。小数部分 指数部分其中,正负号可有可无,无正负号即为正实数;整数部分和小数部分都是十进数字符序列; 指数部分是 e(或 E)后接上正负号(正号可有可无)和十进数字符序列。按上述格式书写实型常量,另有两条限制:(l)整数部分和小数部分可以任选,但不可同时都没有。(2)小数点和指数部分不可以同时都没有。ANSIC 引入两个后缀字符,用 f 标识 float 型实型常量,用 1(或 L)标识 fong double 型 实型常量,而无后缀符的实型常量被认为是 double 型的实型常量。要注意实型常量的有效位数, 不要以为写上的数字都能被计算机所接受。 在大多数 C 系统中, 一个 float 型实型数据在内存中占用 4 个字节(32 个二进位) ,约 7 个十进位有效数字,能表示绝 对值最接近 0 的实数约为 10 的-38 次方,最大的实数约为 10 的 38 次方。例如,对于代码 float x=f,在大多数系统中,实型常量 f 的最后两位数字是无效的。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 标识符 常量其中的标识符也称作符号常量,这里的常量是前面所述的某种常量、或是程序中前面定义的 符号常量。例如:# define MAXN 1002.3 变量变量是程序执行时,其值允许改变的数据对象,用来存储输入数据、计算的中间结果和程序 的最终结果等。1.变量定义 变量用标识符命名,通过变量定义引入的变量名习惯用英文字母开头,C 系统可能也会预定 义一些标记系统特性的变量,系统定义的变量习惯用下线字符开头。变量的数据特性由变量定义 时指定的类型确定。若定义指定数据类型的变量(即不在指定数据类型基础上定义新数据类型的 变量,如指定类型的指针、数组等) ,这种变量定义的句法为:数据类型符变量名 1,变量名 2,……;编绎系统根据变量的数据类型确定存放它的值所需要的内存字节数,变量值的内部表示形多 也由其类型确定。2.内部变量和外部变量变量按其定义出现在程序中的位置不同分成两类:在函数内定义的变量称为内部变量,而在 函数之外(函数之间)定义的变量称为外部变量。3.变量的存储类型系统按程序对计算机存储空间使用的不同要求,将内存分成不同用途的块,与计算机的寄存 器一起将存储空间分成不同类别。而 C 程序通过指定变量的存储类表明变量的不同的使用要求, 让系统将变量分配于不同的内存块或寄存器。如在上述变量定义形式中,还要指定变量的存储类 型,变量定义的形式为:存储类型符数据类型符变量名 1,变量名 2,…;其中存储类型有四种: auto(自动的) 、static(静态的) 、register 寄存器的)和 extem 外部 的) 。外部变量只允许被指定为静态的,或不指定其存储类型。内部变量可以被指定为自动的或静 态的、或寄存器的、或不指定存储类型,若不指定存储类型,它就是自动的。自动变量是内部变量,在函数内或复合语句内定义,它们被分配在堆栈区。静态变量可以是内部变量,也可以是外部变量。静态变量表示永久性和专用性,即在程序执 行过程中一直存在,局限于定义它的函数(内部静态变量)或局限于定义它的程序文件中那些函 数(外部静态变量) 。静态变量被分配在与程序相联的内存数据区。寄存器变量是函数的内部变量或参数,也是一种临时性的变量。如因函数使用非常频繁程序 希望将它分配在寄存器,程序就可将变量指定为寄存器的,但编译系统也可能把它当作动变量处 理。指定存储类型是外部的,实际 b 是告诉编译器,这个变量是一个外部变量,在这里要使它, 而它的定义或在别的程序文件或在后面的程序段等别的地方。4.变量的作用域和生存期变量的使用要注意变量的作用域(可使用范围)和生存期(存在的时间) 语言规定,内部 。C 变量的作用域只局限于定义它的函数或复合语句。自动的内部变量是一种临时性变量,函数被调 用时分配,函数执行结束时释放。而静态变量在程序执行前分配,直至程序结束才释放。由于静 态的内部变量在函数结束时,依旧保持存储,函数上一次调用时留在内部静态变量中的结果能被 下一次调用时继续使用。外部变量也在程序启动前分配,直至程序执行结束释放。普通的外部变 量能提供别的源程序文件中的函数使用 (要对它作外部说明) 静态的外部变量只能供定义它的源 ; 程序中的全部函数专用。由于外部变量能供整个程序使用,所以外部量回复 举报飘过 0 砸 0 顶 0 3楼路漫漫 发表于
11:00:19不能重名。5.变量定义初始化变量定义是对变量的存储空间提出一种要求,存储空间分配后,变量的初值通常是不拔的。 但程序可以要求系统在为变量分配存储空间同时为变量设定初值,这就是变量定义初始化。在变 量的定义形式中,在变量名之后接上“=初值表达式” 该初值表达式的值就作为该变量的初值。C , 语言另有约定,对于静态变量和外部变量,若定义它们时未指定初值,系统给它们设置成全部二 进位都是 0 的值。以下是各种变量定义的例子:(l)定义整型,并对其初始化。 Short minInt =100;int i= l,j= 2, k=3;long p=-1L,q=L;unsigned usi= 254u;unsigned long up= UL;(2)定义字符型变量,并对其初始化。char ch=‘A’ ;(3)定义实型(浮点型、双精度型)变量,并对其初始化。float f=1.23456f;double d=1.654;2.4 运算符每个运算符都代表对运算对象的某种运算, 都有自已特定的运算规则, 规定运算对象的个数、 运算对象数据类型,以及运算结果的数据类型。C 语言还规定运算符有不同的优先级和结合性。 运算符的优先级指表达式求值时,按运算符的优先级由高到低的次序计算。如“先乘除后加减” 运 。 算符的结合性是指运算符要求它的运算对象对它的结合方向。结合性确定了在相同优先级运算符 连续出现的情况下运算对象与运算符结合的顺序,通常也是计算顺序。如算术运算符的结合性是 从左至右的, 则连续的加减或连续的乘除是从左向右计算。 而赋值运算符的结合性是从右至左的, 则连续的赋值运算是从右向左逐个计算赋值。在 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 就是普通的解释: 的值比原值增加 1” x 是指针,它指向数组的某个元素,则++x 使它指向数 “x ; 组的后一个元素。后缀++后缀++的一般形式是变量++表达式“变量++”运算结果是该变量的原来值,在确定了表达式结果之后,用与前缀++相同 的方式增大该变量的值 1 个单位。前缀++和后缀++都能使变量的值增加 1 个单位,但是它们所代表的表达式的值却不相同,前 者是变量增加后的值,后者是变量还未增加的原先值。例如 i,j 为整型变量,且 i 的值为 4,以 下分别用①和②表记的代码将使 j 获得不同的值:①j=++i ;②j= i++都使变量 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) 。然而在 TURBO C 和 MS C 系统中,它的值为 8.而表达式(++i)+(++i)的值为 12.这是因为这些系统在处理 i++时,先使用 i 的原值计算整个表达式,然后再让 i 连 续两次自增;处理++i 时,在计算表达式值之前,先对 i 执行两次自增,然后才计算表达式。放 前一个表达式的值为 8,后一个表达式的值为 12.因+与++(-与――类似)是两个不同运算符,对于类似表达式 i+++j 会有不同的理解: (i++) + j 或 i+(++j) C 编译的处理方法是自左至右让尽可能多的字符组成一个合法的句法单位(如 。 标识符、数字、运算符等) 。因此,i+++j 被解释成(i++)+j,而不是 i+(++j) 。增 1(++)和减 1(――)运算符的结合方向是自右至左的。回复 举报飘过 0 砸 0 顶 0 4楼路漫漫 发表于
11:00:492.关系运算符用于关系运算的关系运算符有六个:&(小于) 、&(大于) 、&=(小于等于) 、&=(大于等于) 、 ==(等于)和!=(不等) 。关系运算是双目运算,它的运算对象可以是基本数据类型的数据,用 于比较大小;或是指向同一个数组两元素的指针,用于比较前后关系。在高级语言中,习惯称条 件满足为“真” 不满足为“假” 特别在 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.在具体编写程序时,也应利用以上性质。 对于两个条件的逻辑与,如当条件 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)将求得的值赋给变量,即存储到由变量所占的内存中。简单地说,计算表达式的值,将该值赋给变量。赋值运算也有结果,经赋值运算后,赋值表达式具有赋值后赋位运算符左边变量同样的类型 和值。因赋位运算有值,所以可以进一步参与运算,特别是可以再赋植给其它变量。赋值运算符 的结合性是‘边有至左“的,当连续有多个赋值运算时,则从右至左逐个赋值。如有变量定义:int k; double x;则赋值表达式:x= k= 3.5是先将实数 3.5 自动转换成整数 3 赋给整型变量 k,然后又将整数 3 自动转换成实数 3.0 赋给 实型变量 X.所以,k 的值是 3,X 的值是 3.0.在程序中,经常遇到在变量当前值的基础上作某种修正的运算。如x=x+5.0这类运算的特点是:变量既是运算对象,又是赋值对象。为避免对同一存储对象的地址重复 计算,C 语言弓队复合赋值运算符。它们是+=、-=、*=、%=、〈=、〉= 、&= 、^=、|= 〈 〉 通常,记日为某个双目运算符,复合赋值运算xθ=e其等效的表达式为x= xθ(e)注意,当 e 是一个复杂表达式时,等效表达式的括号是必需的。如y*= a+b的等效表达式是 y= y*(a+b)赋值运算符和所有复合赋值运算符的优先级全相同,并且都是“自右至左”结合,它们的优 先级高于远号运算符的优先级,低于其它所有运算符的优先级。5.逗号运算符逗号运算符“, ”用于将若干表达式连接起来顺序地逐个计算。连续返号运算的一般形式为:表达式 1,表达式 2,…,表达式 n它的计算顺序是从左到右逐一计算各表达式,并以表达式 n 的值为连续逗号运算的结果。例 如,表达式x=( i=3, i*2)使 i 等于 3,X 等于 6.其实,逗号运算只是把多个表达式串联起来,在许多情况下,使用逗号 运算的目的只是想分别计算各个表达式的值,而并非想使用逗号运算中最后那个表达式的值。逗 号运算最常用于 for 结构中,用于给多个变量登初值,或用于对多个变量的值逐一修改等。逗号 运算符的优先级最低,其结合性是“自左向右”的。 6.条件运算符条件运算是一个三目运算,有三个运算对象。条件运算的一般形式为表达式 1?表达式 2:表达式 3条件运算的计算规则是:(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)7.长度运算符长度运算以字节为单位给出其运算对象所需(或所占)的字节数,运算对象可以是任何类型 的数据对象或数据类型。它是根据对象的类型来确定对象(所需)的字节数的。长度运算有两种书写形式:sizeof 变量名或 sizeof(类型名)如果有某种类型为江的变量 V,其中 t 可以是系统提供的类型或用户自己定义的类型,可以 是简单的,也可以是数组、结构等。则 sizeof V 就是变量 V 所占的字节数。如有int j;double x;表达式 sizeof j 和 sizeOf x 分别是变量 j 和 x 所占的字节数。sizeof(t)是系统为分配一个类型为 t 的数据对象所需的字节数。如 sizeOf(int)和 sizeof(d ou-ble)分别是系统为分配一个类型为 int 和 double 变量所需的字节数。8.位运算符位运算的运算对象只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位率 信息,按位完成指定的运算,得到位串信息的结果。位运算符又可分成两类:一类是位逻辑运算 符,另一类是位移位运算符。位逻辑运算符有:&(按位与) 、|(按位或) 、^(按位异或) 、~(按位取反)位移位运算有:&&(位左移)和&&(位右移)其中按位取反运算符是单目运算符。其余均为 双位运算符。位逻辑运算符的优先级从高到低,依次为~、&、^、|、 ,其中的结合方向自右至左, 且优先级高于算术运算符,其余运算符的结合方向都是自左至右 ,且优先级低于关系运算符。位 移位运算符的优先级低于算术运算符,高于关系运算符,它们的结合方向是自左至右。按位与运算符(&)按位与运算将将两个运算对象的对应位按位遵照以下规则进行计算:0&0=0, 0&l=0,1&0=0,1&l=1即同为一的位,结果为 1,否则结果为 0.例如,设 3 的内部表示为
的内部表示为 ,则 3&5 的结果为
按位与运算有两种典型用法。一是取一个位率信息的某几位,如以下代码截取。的最低 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 顶 0 5楼路漫漫 发表于
11:00:49= 0, 0^1=l, l^0=l, 1^l=0即相应位的值相同的,结果为 0,不相同的结果为 l.例如,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 表达式表达式就是将运算符与运算对象连接起来描述计算的式予。按表达式的构成规则分,表达式 可分以下几类:1.初等量表达式初等量表达式是常量、变量、字符串、函数调用、数组元素、结构成分和带圆括号的表达式 等。2.单目运算表达式单目运算表达式是由单目运算符和一个运算对象构成的表达式。单目运算符的优先级低于初 等量的运算符,它们的结合性都是“自有向左”结合。3.双目运算表达式双目运算表达式的一般形式为表达式 双目运算符 表达式双目运算符自左向右结合。按双目运算符分类,又可分算术表达式、关系表达式、逻辑表达 式、赋值表达式和远号表达式。由于 C 语言没有特别的真、假值,判定时,以非 0 值为真,以 0 值为假。所以,前述的 C 语言的各种表达式的计算结果都可作为逻辑值。4.条件运算表达式条件运算表达式的一般形式为表达式?表达式:表达式条件运算符自右向左结合。2.6 数据类型转换1.隐式类型转换C 语言允许基本数据类型中的不同类型数据进行混合运算。因不同类型的数据所占内存字节 数和其内部表示形式的不同,在算术运算中(其它运算例外)一个运算符所涉及到的各运算对象, 能根据运算对象的情况,要求运算对象的值从一种类型转换成另一种类型。这种类型转换是自动 进行的,称作隐式类型转换。隐式类型转换严格遵守以下规则,按所列优先顺序实行类型转换。(1)如有运算对象是 long double 型的,则其余运算对象也转换成 long doube 型。(2)如有运算对象是 double 型的,则其余运算对象也转换成 double 型。(3)如有运算对象是 float 型的,则其余运算对象也转换成 float 型。(4)如有运算对象是 unsigned long int 型的,则其余运算对象也转换成 unsigned long int 型。(5)如有运算对象是 long int 型的,则其余运算对象也转换成 long int 型。(6)如有运算对象是 unsigned int 型的,则其余运算对象都转换成 unsigned int 型。(7)最后,运算对象和结果都是 int 型的。 根据最后一条规则,两个 char 型和 short 型运算对象都自动转换成 int 型参与运算,并且结果 是 int 型的。2.显式类型转换算术运算中,基本数据类型的混合运算会发生隐式类型转换,当要求与隐式类型转换规则不 一致时,可在表达式中用显式类型转换运算,强制地将一种类型的表达式值转换成另一种类型的 位。显式类型转换的书写形式为(类型名)表达式其中(类型名)是对其后的表达式作强制类型转换运算,它将表达式的值强制地转换成类型 名所指明的类型。例如,库函数 sqrt()是求一个 double 型值的平方根。为求整型变量 m 的平方 根,正确的写法是 sqrt( (double)m)在求 m 的平方根之前,先将 m 的值强制地转换成 double 型,然后去调用函数 sqrt() 。类型转换不只改变表达式的值的类型,也可能会因两种表示形式上的差异,值的大小会有一 些误差。回复 举报飘过 0 砸 0 顶 0 6楼路漫漫 发表于
11:02:043.1 顺序结构顺序结构用来描述一个计算或操作序列,表示从序列的第一个计算开始,顺序执行序列中的 每个计算,直至序列的最后一个计算。通常,一个复杂的计算过程不能用一个简单的计算来表达, 而需把复杂的计算描述成简单计算的序列。1.复合语句在 C 语言中,将顺序执行的语句序列,用花括号括起来,构成 C 语言的复合语句。在逻辑上 视复合语句为单个语句,它也能用作其它结构语句的成分语句。在很多场合,复合语句内还会包 含其它结构语句。2.表达式语句在顺序结构中,最频繁使用的是表达式之后接上一个分号。例如,在赋值表达式之后接上分 号,完成用表达式的值更新某变量,习惯称这种表达式语句为赋值语句;在函数调用之后接上分 号,完成指定的计算功能,习惯称这种表达式语句为函数调用语句。3.2 常用输入输出库函数最基本的输入输出库函数有字符输入函数、字符输出函数、格式输入函数和格式输出函数。1.字符输入函数字符输入函数 getchar()的功能是从标准输入设备上(通常是键盘终端)读取一个字符。该 函数没有参数,对它的每次调用,就返回下一个输入字符的 ASCII 代码值。例如,执行语句ch=getchar() ;使变量 ch 得到输入字符的 ASCII 代码值。一般情况下,这里的变量 ch 为 char 型或 int 型。 当程序在输入字符后,用 ch 判定输入文件是否结束时,变量 ch 必须是 int 型的。这是因为文件结 束标记值是-1,是 int 型的。程序中常用 EOF 表示当前读人字符是文件结束标记,常量名 EOF 在 文件 Stdio.h 中被定义为-1.2.字符输出函数字符输出函数 ptuchar()有一个字符的 ASCII 代码值参数,函数调用 putchar (ch)的功能 是将以出值为其 ASCII 代码的字符输出到标准输出设备(通常是终端显示屏)上。这里 ch 可以 是 char 型或 int 型数据。3.格式输入函数格式输入函数 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 型存储。缺省时,对于格式符 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是正确的;而输入1 2等其它形式都是不正确的。(3)在用“%c ”格式转换说明输入字符时,空白类字符和用转义字符表示的字符都能作为 有效字符输入。要输入一串空白类字符之后的第一个非空白类字符,可采用格式“% C” 格式字 。 符率中的空格符使输入跳过空白类字符到第一个非空白类字符,然后被 C 格式输入。(4)为整型变量输入整数时,若变量类型为短整型,则必须在格式符之前加长度修饰说明 h; 若变量类型为长整型,则必须在格式符之前加长度修饰说明 1.(5)输入数值数据时,输入字符流中的前导空白类字符会被自动跳过,从空白类字符后的数 值数据字符开始输入。构成数值数据的字符被输入转换成计算机的内部表示,并存储结果。若第一个非空白类字符不能构成数值字符,则立即结束输入。(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) ,如输入字符行为将使变量 i=123,j=78.其中数据 456 因赋值抑制符*的作用被跳过。一般从键盘读入数据, 不指定输入数据项的有效字符数,数据项与数据项之间用空白符,或制表符,或回车符分隔。4.格式输出函数格式输出函数 printf()的作用是将输出项接指定的格式排版输出到标准设备上(通常是终端 显示屏) 。调用 printf()函数的一般形式为 printf(格式控制字符串,表达式,表达式,……)其中格式控制字符率是字符串表达式,通常是由用一对双引号括起来的字符串常量。它包含 三类字符:普通字符、转义字符和格式转换说明,它们的作用分别如下:(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 格式输出回复 举报飘过 0 砸 0 顶 0 7楼路漫漫 发表于
11:02:29说明:(1)x 格式符同。格式符一样,把符号位作为数的一部分输出。对于 x 格式,用字符 a、b、 c、d、e、f(或 A、B、C、D、E、F)表示 9 之后的六个十六进制数字符。(2)一个整数,只要它的位在 0-255 范围内,也可以用字符形式输出,输出以该整数为 A SCII 代码的字符。反之,一个字符数据也可以用整数形式输出,输出该字符的 ASCII 代码值。(3)f、e 和 g 格式符用于输出实型数据,格式转换时有四舍五人处理。对于 f 格式,小数点 后的数字个数可由格式修饰说明 p 指定,若 p 为 0,不显示小数点。用 e 格式输出时,对于非 0 实数, 小数点前有一位非零数字, 输出格式中的有效位数可由格式修饰说明 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,表示对应的输出项是长整型或无符号长整型。以下是格式输出的一些例子。例如,int i=1234; long j=1234567L;printf( “%d,%+6d,%06d,%-6d, %5ld” i,i,i,i,j) ,将输出:1234,+,7 注意:对于 long 型数据输出,必须在格式符之前有长度修饰符 l,表明输出 long 型数据。若 int k=045;long p=-1L;printf( “%#o,%4o,%6lo” k,k,p) ,将输出:045, 45, 而 printf( “%#x,%4x,%6lx” k,k,p)将输出: ,0x25, 25, FFFFFFFF若 unsigned int u= 65535u;prinif( “%d,%4u,%ln‘,u,u,p)将输出:-l, 65535, 若 char ch1= 045, ch2=‘a’ printf( ; “%c,%-3c,%2c” ch1,ch2,ch2) ,将输出:%,a, a若 char s[]==“ABCDEF‘;printf(”%3s,%4.2s,%-7.4s,%.5s“,s,s,s,s)将输出:ABCDEF, AB, ABCD, ABCDE若 float f=123.4567f; double d=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.e+02注意:实型数据的有效位数,不要以为凡是打印(显示)的数字都是准确的。一般地,float 型只有 7 位有效数字,double 型有 15 位有效数字。实际上,因计算过程中的误差积累,通常不能 达到所说的有效位数。另外,要注意%g 格式的特殊性,当它选择“整数部分。小数部分”形式时,因格式修饰说明。 p 在 e 格式中的意义是指明精度,所以 p 的值是整数部分位数与小数部分位数之和(不是 f格式中的小数位数) 。如有float g1=12.34f,g2=0.0f;double d=123.456789, g=;printf( “%g,%G” g1,g2) , ;printf( “%f,%g,%g,%g,%.8g”,g1,g1,d,g,g) ‘将输出:12.34,012..34,123.457,3456.793.3 选择结构 选择结构有单分支选择结构、双分支选择结构和多分支选择结构。C 语言提供相应的 if 语句 和 switCh 语句分别用来描述这些选择结构。1.单分支选择语句单分支选择语句有以下形式:if(表达式)语句这种形式的语句执行过程是:(l)计算表达式的值;(2)测试表达式的值。若表达式的值非 0,则执行它的成分语句,并结束单分支选择的执行; 若表达式的值为 0,则立即结束单分支选择的执行。2.双分支选择语句汉分支选择语句有以下形式:if(表达式)语句 1else语句 2双分支选择语句根据给定的选择条件表达式值为非 0 或为 0 两种情况,从两个供选择的成分 语句中自动选取一个成分语句执行。双分支选择语句的执行过程是: (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:语句序列 2 case 常量表达式 n:语句序列 ndefalt:语句序列 n+1}对 switeh 语句需说明以下几点:(1)switch 后面括号内的表达式只限于是整型表达式或字符型表达式或枚举型表达式。(2) case 后的常量表达式称为情况前缀,要求所有常量表达式的值互不相同,并与 switch 后面括号内的表达式值的类型相一致。(3)语句序列由任意条合法的 C 语句构成,也可以没有语句。(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 砸 0 顶 0 8楼路漫漫 发表于
11:02:29 为 0,则结束 while 语句;(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 语句一样,当循环体由多个语句组成时,必须把它们书写成复合语句。有些用 whil e 语句描述的循环计算,也能用 do-while 语句描述。然而,并非总是如此。两者的重要区别在于: 执行循环体时, 对作为循环条件的表达式的求值和测试的时间不同。 while 语句对作为循环条件的 表达式求值和测试在执行循环体之前, do-While 语句对作为循环条件的表达式求值和测试在执 而 行循环体之后。对于 do-while 语句,它的循环体至少被执行一次,而 while 语句的循环体在作为 循环条件的表达式值一开始就为 0 的情况下,就一次也未被执行。如能保证 while 语句中的作为 循环条件的表达式在第一次被求值后,总是非 0,则把该循环条件移至循环体执行之后求值和测 试,能起同样的控制作用。在这种情况下,while 语句就能改写成如 while 语句。如 while 语句中 的作为循环条件的表达式值可能初次求值就为 0 时,则它不能简单地改写成 do-while 语句。另外 要特别指出,分号是 do-while 语句的结束符,不能省略。3.for 语句for 语句是 C 语言中最灵活、使用最广泛的循环结构语句。如以最一般意义下考虑循环,一 个完整的循环应包含对有关变量赋初值部分、控制循环的条件、一个要循环计算的操作、每次循 环后对有关变量的修正等四部分组成。拉语句就是从这一般意义下表达循环结构的语句。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(;) ; 语句(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 语句构 成的循环改写成结构化控制结构描述的循环。回复 举报飘过 0 砸 0 顶 0 9楼路漫漫 发表于
11:02:584.1 一维数组1.数组的基本概念数组是一组同类对象集合的一种表示。在 C 语言中,数组类型是这样一种数据结构:数组所 有元素的数据类型相同, 元素个数固定, 其元素按顺序存放, 每个元素对应一个序号 (称为下标) , 数组元素的下标从 0 开始顺序编号,各元素按下标存取(引用) 。数组元素变量能与相同类型的独 立的变量一样使用。引用数组元素变量所需的下标个数由数组的维数决定,数组有一维数组、二 维数组或多维数组之分。2.一线数组的定义一维数组的定义形式为类型说明符数组名[常量表达式」 ;例如int a[5] ;定义一个名为 a 的数组,它有五个元素,每个元素都是整型。数组定义包含以下几个要点:(l)类型说明符用来指明数组元素的类型,同一数组的诸元素,它们的类型是相同的。(2)数组是一个变量,与一般变量一样,用标识符命名,数组名遵守标识符的命名规则。(3)方括号“[]”是数组的标志,方括号中的常量表达式的值表示数组的元素个数,即数组的 长度。例如,int a[5]中的 5 表示数组 a 有 5 个元素,下标从 0 开始,这五个元素分别是:a[0]、 a[1]、a[2]、a[3]和 a[4].(4)常量表达式通常是整型常量、符号常量或 sizeof(类型名) ,以及由它们组成的常量表 达式。定义数组大小用常量表达式,就是说数组的大小是固定的,不可以包含引用变量值的表达 式来定义数组的大小。(5)C 语言有一个约定,当数组名单独出现在表达式中时,数组名可以代表为它分配的内存 区域的开始地址,即数组中下标为 0 的元素的地址。在这种情况下,数组名起着一个常量的作用, 即 a 与&a[0]作用一样。如代码 scanf( ,&a[0])与 scanf( ,a)都是为数组 a 的第一个元 “%d” “%d” 素输入值。3.一维数组的初始化可在数组定义同时,给出数组元素的初值。这种表述形式称为数组初始化。数组初始化可用 以下几种方法实现:(l)数组定义时,顺序列出数组全部元素的初值。例如,int d[5]={0,l,2,3,4};将数组元素的初值依次写在一对花括弧内。经上面定义和初始化之后,就有 d[0]=0.d[l]=l、 d[2]=2、d[3]=3、d[4]=4.(2)只给数组的前面一部分元素设定初值。例如,int e[5]={0,l, 2};定义数组 e 有 5 个整型元素, 其中前三个元素设定了初值, 而后两个元素末明确地设定初值。 系统约定,当一个数组的部分元素被设定初值后,对于元素为数值型的数组,那些末明确设定初 值的元素自动被设定 0 值。所以数组 e 的后两个元素的初值为 0.但是,当定义数组时,如未对它 的元素指定过初值,对于内部的局部数组,则它的元素的值是不确定的。(3)当对数组的全部元素都明确设定初值时,可以不指定数组元素的个数。例如, int g[]={5,6,7,8,9};系统根据初始化的花括号内的初值个数确定数组的元素个数,所以数组 g 有五个元素。但若 提供的初值个数小于数组希望的元素个数时,则方括号中的数组元素个数不能省略。如代码 int b[10]={1,2,3,4,5}定义数组 b 有 10 个元素,前五个元素如设定所示,后五个元素都为 0. 反之,如提供的初值个数超过了数组元素个数,就是一个错误。4.一维数组元素的引用程序定义了数组后,就可引用数组的元素。引用数组元素的一般形式为数组名[下标]其中下标可以是整型常量、整型变量或整型表达式。例如,数组 a 的五个元素可分别用 a[0]、 a[l]、a[2]、a[3]、a[4]来引用它们。设有定义:int x[20], i;以下代码实现顺序输入数组 X 的全部元素:for(i=0; i&20;i++)scanf( ,&x[i]) “%d” ;4.2 二维数组和多维数组1.多维数组定义数组也可以是多维的。现以二维数组为例介绍二维及二维以上的多维数组。二维数组的定义 形式为类型说明符 数组名「常量表达式」 [常量表达式」 ; 通常多维数组的定义形式有连续两个或两个以上“ 「常量表达式」。例如, ”float a[2][3],b[3][4]; /*两个二维数组*/float c[2][2][3] ;/*一个三维数组*/定义数组 a 为 2 行 3 列,数组 b 为 3 行 4 列。C 语言把二维数组看作是一种特殊的一维数组, 即它的元素又是一个数组。例如,对于上述定义的数组 a,把它看作有两个元素的一维数组:a[0]和 a[l]每个元素又是一个包含 3 个元素的一维数组。通常,一个 n 维数组可看作是一个一维数组, 而它的元素是一个(n-1)维的数组。C 语言对多维数组的这种观点和处理方法,使数组的初始化、 引用数组的元素以及用指针表示数组带来很大的方便。在 C 语言中,二维数组的元素的存放顺序是按行存放的,即从数组的首地址开始,先顺序存 放第一行的元素,再存放第二行的元素。通常,对于一个多维数组,它的元素在内存中的存放顺 序有这样特点:第一维的下标变化最慢,最右边的下标变化最快。2.引用多维数组元素引用二维数组元素的表示形式为数组名[下标][下标]通常,引用 n 维数组元素的表示形式为数组名之后紧接连续 n 个“[下标]” 。在用下标引用数组的元素时, 应该注意下标值的有效性, 应在已定义的对应维大小的范围内, 即大于等于 0 和小于对应维的元素个数。3.多线数组初始化多维数组的初始化方法也有多种,以二维数组的初始化方法为例说明其初始化方法。 (1)按行给二维数组的全部元素赋初值。例如int al[2][3]={{1,2,3 },{4,5,6 }};这种赋初值方法比较直观,第一个花括弧内的数据给第一行的元素赋初值,第二个花括弧内 的数据给第二行的元素赋初值,依次类推,按行给数组的全部元素赋初值。(2)按元素的存储顺序给数组元素赋初值。例如,int a2[2][3]= {1,2,3,4,5,6 } ;这种赋初值方法结构性差,容易遗漏。(3)按行给数组的部分元素赋初值。例如,int a3[2][3]={{1,2},{0,5}};其效果是使 a3[0][0]=l,a3[0][1]=2,a3[1][0]=0,a3[1][l]=5,其余均为 0.(4)按元素的存储顺序给前面部分元素赋初值。例如,int a4[2][3]={1,2,3,4 };其效果是使 a4[0][0]=1,a4[0][l]=2,a4[0][2]=3,a4[1][0]=4,其余均为 0.(5)按元素的存储顺序,给数组部分或全部元素赋初值,并且不指定第一维的元素个数。例 如,int a5[][3]={l,2,3,4,5 } ;系统会根据结出的初始数据个数和其它维的元素个数确定第一维的元素个数。其效果是使:a5[0][0]=1,a5[0][1]=2,a5[0][2]= 3, a5[1][0]=4,a5[l][l]=5,a5[1][2]=0.所以数组 a5 有 2 行。(6) 用按行赋初值方法,对各行的部分或全部元素赋初值,并省略第一维的元素个数。 例如,int a6[][3]={{O,2},{}};也能确定数组 a6 共有 2 行。4.3 字符数组和字符串1.字符数组如果数组的元素类型是字符型(char) ,则此数组就是字符数组。字符数组的每个元素只能存 放一个字符(存放字符的 ASCII 代码) 。字符数组的定义形式与其它数组的定义形式一样:char 字符数组名[元素个数];例如,char S[5];表示数组 S 有五个元素,每个元素能存放一个字符,整个数组最多可存放五个字符。字符数 组元素的引用方法也与普通数组元素的引用方法相同。字符数组也可与普通数组一样的初始化,字符数组也可利用字符串常量给字符数组初始化。 例如,char aStr[]={“12345”}; 并可省略花括弧,简单地写为char aStr[]=“ 12345” ;注意:字符数组 aStr[]的元素有六个,不是五个。用字符串常量对字符数组初始化,C 系统会 在字符列末尾添加一个字符串结束符。2.字符串称最后有字符率结束符'\0'的字符序列为字符串。字符数组中存储的字符序列本身并不要求最 后一定要有字符'\0'.但当字符数组内存储的内容需要作为字符串时, 就必须要有标记符'\'.当字符数 组内存储的是字符串时,可用“%s”格式输出,若是普通的字符序列,则它不能用格式“%s”输出, 而只能结合循环用格式“%c”输出。指定元素个数的字符数组用字符串常量给它初始化时,其元素个数不能小于字符串常量的字 符数,但数组的元素个数可以等于字符串常量的字符数。例如,char ss[3]=“abc” ;则, ss[0]='a',ss[l]='b', ss[2]='c'.此时,字符数组 ss 中存储的是字符序列,不是字符串。字符率结束标记符的代码是 8 位全 0,称为空字符,程序用'\0'来标记。字符串的结束标记符 紧接在字符串的有效字符列之后。例如,一个有 8 个有效字符的字符串,其长度为 8 个字符,但 在它的第九个位置存有结束标记符'\0'.请读者注意以下几点:(l)字符率与存储字符串的字符数组有区别。字符率的有效字符是指从所指位置的第一个字 符开始至字符串结束标记符之前的那些字符。格式符“%s”只输出字符串的有效字符,而不会再继 续输出字符率结束标记符及其之后的字符。例如,char str[50]=“Pas\0cal Cobol Fortran C” ;printf( “%s\n” str) ; , 将只输出:Pas而实际上,数组 str[]字符率结束符之后还存有其它许多字符。(2)用“%s”格式输出字符串时,不包括字符串结束标记符。对应的输出项是字符串或字符 串名。字符数组名可作为字符串名。对于上例,写成printf( ,s[0]) “%s” ;是错误的。因 s[0]是数组 s 的元素,是一个字符,不是字符串。(3)在调用 scanf()为字符数组输入字符串时,输入项是数组名,不要加地址运算符&.(4)若用“%c”格式结合循环输入字符序列,若程序又想将输入的字符序列构成字符串,回复 举报飘过 0 砸 0 顶 0 10 楼路漫漫 发表于
11:02:58则程序必须用赋值语句在字符列之后存入字符串结束标记符,使其变成字符串。程序经常要处理许许多多的字符串,如存储星期的名称。同时存储众多字符串的一个实现方 法是定义一个二维字符数组,让二维数组的每一行存储一个字符串。这样做,要求数组每行元素 个数应比可能最长的字符串字符个数还要多 1 个。如下面的示例所示:char weekDay[][9]= {“Sunday” “Monday” “Tuesday” “Wednesday” , , , ,“Thursday” “ Friday” , , “Saturday”};在 C 程序中,存储多个字符串更好的方法是用指针数组。3.常用字符串库函数 求字符串长度函数 strlen()函数调用 strlen(str)返回 str 中的有效字符(不包括'\0')的个数。字符串拷贝函数 strcpy()函数调用 Strcpy(strl,str2) 将字符串 str2 拷贝到字符数组 strl.要求字符数组 strl 足够大, 以便能容纳被拷贝的 str2 的全部内容。限制字符数的字符串拷贝函数 strncpy()函数调用 strncpy(strl,str2,n)的作用是将 str2 中的前 n 个字符拷贝到 strl(并附加'\0') 。 其中 n 是整型表达式,指明欲拷贝的字符个数。如果 str2 中的字符个数不多于 n,则函数调用strncpy(strl,str2,n)等价于 strcpy(strl,str2) 。字符串连接函数 strcat()函数调用 strcat(strl,str2) 将 str2 内容拷贝接在字符数组 strl 中的字符串的后面。要求字符 数组 strl 必须足够大,以便还能容纳 str2 的内容。该函数调用返回 strl 的开始地址。注意:字符 串连接前,strl 和 str2 都各自有'\0',连接后,strl 中原来的'\0'在拷贝时被覆盖掉,而在新的字符率 有效字符之后再保留一个'\0'.例如char strl[30]=“Beijing” ;char str2[30]=“ Shanghai” ;函数调用strcat(strl,str2) ;printf( “%s \n” strl) , ; 将输出:BeijingShanghai字符串比较函数 strcmp()函数调用 strcmp(strl,str2)批较两个字符串的大小,对两个字符串自左至右逐对字符相比 较(按字符的 ASCII 代码值的大小) ,直至出现不同的字符或遇到'\' 字符为止。如直至'\' 字符, 全部字符都相同,则认为相等,函数返回 0 值;若出现不相同的字符,则以这第一对不相同的字 符比较结果为准,若 strl 的那个不相同字符小于 str2 的相应字符,函数返回一个负整数;反之, 返回一个正整数。注意: 对字符串不允许施行关系运算符比较两字符之间的大小关系, 必须类似于本函数那样, 通过逐个字符的比较来实现。字符串输出函数 puts( )函数调用 puts(str) 将 str 的字符串输出到终端,并将 str 中的'\'以字符转换成换行符'\n'输 出。即输出字符串内容后,并换行。所以,puts(str)相当于 printf( “%s\n” str) , 。字符串输入函数 gets( )函数调用 gets(str)从终端输入字符序列(包括空白符)到字符数组 str,字符序列以回车符 作为结束,并将输入时的回车符转换成'\'字符存储。该函数调用返回 str 的存储开始地址。调用 g et()函数与用“%s”格式调用格式输入函数 scanf 输入字符串不同,后者会自动跳过前导空白符, 并以非空白符之后的空白符结束。前者用于输入一行内的全部字符,包括可能有的空白符,存放 于字符数组 str,并将最后读人的换行符转换成字符率结束标记存储在 str 中。回复 举报飘过 0 砸 0 顶 0 11 楼路漫漫 发表于
11:03:295.1 指针和指针变量指针是程序设计语言的一个重要概念。指针在 C 程序中有以下多方面的作用: (1)利用指针能间接引用它所指的对象。(2)利用各种类型的指针形式参数,能使函数增加描述能力。(3)指针与数组结合,使引用数组元素的形式更加多样、访问数组元素的手段更加灵活。(4)指针能用来描述数据和数据之间的关系,以便构造复杂的数据结构。当一个数据 A 要 关联另一个数据 B 时,在数据 A 中增加一个指向数据 B 的指针就可实现数据 A 关联数据 B.结合 系统提供的动态分配存储设施,又能构造出各种动态数据结构。1.指针的基本概念为了区别内存的不同位置,内存被分成字节,内存的全部字节顺序地赋予一个称为地址的编 号。程序中的变量将在内存中占据一定的内存字节,在这些字节中存储的数据信息称为变量的内 容。一个变量占用连续的若干个内存字节时,最前面的一个字节的地址就作为该变量的地址。指 针就是内存地址,是变量的地址,或函数的入口地址。变量的地址在程序执行时,起着非常重要 的作用。当计算机在计算含有变量的表达式时,计算机按变量的地址取出其内容,并按变量的地 址将计算结果存入到变量占据的内存中。如代码:int x=l;x=x+2;其中语句“x=x+2; ”中的第一个 x 涉及到变量 x 占据的内存,第二个 x 是引用变量 x 的内 容。 该语句的意义是“取 X 的内容, 完成加上 2 的计算, 并将计算结果存入变量 X 占据的内存中。 ”2.指针变量和它所指向的变量在 C 语言中,地址也作为一种值,能被存储、比较、赋值,并称地址数据为指针类型,而称 存储地址值的变量为指针变量,简称指针。C 程序可用运算符&取变量的地址,如表达式&x的值就是变量 X 的地址。程序除能按名引用变量外,也可利用变量的地址引用变量。按变量 名引用变量称为直接引用,而将变量 A 的地址存于另一变量 B 中,借助于变量 B 引用变量 A 称 为对 A 的间接引用。3.指针变安的定义、初始化和引用指针变量用于存放某个变量的地址。定义指针变量的一般形式为:类型 * 指针变量名;或类型 * 指针变量名=初值表达式;其中,指针变量名是标识符,指针变量名之前的符号“*” 表示该变量是指针类型的。而最前 , 面的“类型” 表示该指针变量能指向变量或函数的类型。初值表达式是一个地址表达式,如表达式 , 中有某变量的地址表达式,则这个变量应是前面已定义的。在 C 语言中,当定义局部指针变量时,如未给它指定初值,则其值是不确定的。程序在使用 它们时,应首先给它们赋值。误用其值不确定的指针变量间接引用其它变量,会引起意想不到的 错误。为明确表示指针变量不指向任何变量,在 C 语言中用 0 值表示这种情况,记为 NULL.如ip= NULL;也称指针值为 0 的指针变量为空指针。对于静态的指针变量,如在定义时未给它指定初值, 系统自动给它指定初值 0.指针变量取程序对象的(开始)地址值,不能将一个整型量或任何其它非地址值赋给一个指 针变量。另外,指针变量对所指向的对象也有类型限制,不能将一个不能指向的对象的地址赋给 指针变量。如有以下定义:int i=100,j,*ip,*intpt;float f,*fp;以下代码如注释所叙。 iP=&i;/*使 ip 指向 i*/intpt=ip;/*使 intpt 指向 ip 所指变量*/fp= &f;/*使 fp 指向正*/ip=NULL;/*使 ip 不再指向任何变量*/5.2 指针变量的应用1.指向变目的指针变量当指针变量指向某个对象(它的值不是 NULL)时,可以用* 指针变量引用指针变量所指向的对象。如语句:ip=&i;j=* ip;实现将指针变量 ip 所指变量的内容(即变量 i 的内容)赋给变量 j.其中,赋位号右边的*ip 表示引用中所指变量的内容。上述赋值等价于:j=1;语句*ip=200;实现向指针变量 ip 所指变量(即变量 i)赋值 200.其中,赋值号左边的。ip 表示引用 ip 所指 变量。上述赋值等价于 i=200;一般地,记号“* 指针变量名”与指针变量所指变量的“变量名”等价。要特别注意:指针 变量之间的赋值,指针变量所指向的变量之间的赋值,这两种赋值在表示方法上的区别。如语句intpt=ip;使两个指针变量 intpt 与 ip 指向同一个对象,或都不指向任何对象(如果 ip 的值为 NULL) 。 而语句* intpt=*ip;实现将 ip 所指变量的值赋给 intpt 所指的变量。这里要求中与 intpt 的值都不可以是 NULL.通 过指针变量引用它所指的变量,实际引用哪一个变量,取决于指针变量的值。改变指针变量的值, 就是改变了它的指向。指针变量最主要的应用有两个方面:一是让指针变量指向数组的元素,以 便逐一改变指针变量的指向,遍历数组的全部元素;二是让函数设置指针形式参数,让函数体中 的代码通过指针形式参数引用调用环境中的变量或函数。为正确使用指针变量和它所指向的对象,特指出以下几点注意事项:(1)指针变量定义与引用指针变量所指对象采用相似的标记形式(* 指针变量名) ,但它们 的作用与意义是完全不同的。在指针变量定义中(如 int *ip;,指针变量名之前的符号“*”说明其 ) 随后的标识符是指针变量名。如果指针变量定义时带有初始化表达式,如int i, * ip=&i;初始化表达式的地址是赋给指针变量本身,而不是指针变量所指对象(实际上,在初始化之 前,指针变量还未指向任何对象) 。(2)通过指向变量 i 的指针变量 ip 引用变量三与直接按其名 i 引用变量 i ,效果是相同的, 凡直接按名可引用处,也可以用指向它的某个指针变量间接引用它。如有int i, *ip=&i; 则凡变量 i 能使用的地方,*ip 一样能用。(3)因单目运算符* 、&、++和――是从右向左结合的。要注意分清运算对象是指针变量、 还是指针变量所指对象。如有int i,j,*ip=&i;语句j=++*ip;是指 ip 所指向的变量(变量 i)的内容加 1,加 1 后的值赋给变量 j.也就是说,++*ip 相当于 ++(*ip) 。而语句 j=*ip++;相当于语句 j=*ip; ip++;这是因为先求值的是表达式 ip++,它的 求值规则是,表达式的值为原来 ip 的位,然后 ip 的内容增加了 1 个单位。所以。 ip++的表达式 值与*ip 相同,并在*ip++求出表达式值的同时,指针变量 ip 增加了 1 个单位。这样,ip 不再指向 变量 i,这种情况常用在指针指向数组元素的情况,在引用数组某元素之后,自动指向数组的下一 个元素。而语句 j=(*ip)++;则是先引用 ip 所指向的对象,取 ip 所指向的对象的内容赋给 j, 并让中所指向的对象的内容增加 1 个单位。2.指向一维数组元素的指针变量指针变量也能指向数组的元素。设有以下变量定义:int a[100],*p;赋值运算 p=&a[0]使 p 指向 a[0].表示&a[0]还有更简洁的方法,即数组名 a.按约定,一维数 组名表达式的值为数组存储区域的开始地址,即数组首元素的指针。对指向数组元素的指针允许 作有限的运算。设有代码:int *p,*q,a[100] ;p=&a[10] ; q=&a[50] ; (l)指向数组元素的指针可与整数进行加减运算。利用数组元素在内存中顺序连续存放的规 定,和地址运算规则,有表达式 a+1 为 a[1] 的地址,a+2 为 a[2]的地址。一般地,表达式 a +i 为 a[i]的地址。把这个结论应用于指向数组元素的指针,同样地成立。若 p 的值为 a[0]的地址, 则表达式 p+i 的值为 a[i]的地址。或者说,p+i 的值为指向 a[i]的指针值。若 p 指向数组元素 a[1 0],则 p+n 就表示指向数组元素 a[10+n],这里 n 是任意的整数表达式。一般地,当指针变量指向数组 a 的元素时,不论数组元素的类型是什么,指针和整数 n 进行 加减运算时,总是根据所指元素的数据存储字节长度 sizeof a[0] ,对 n 放大,保证加减 n,使指 针植向前或向后移动 n 个元素位置。(2)当两个指针指向同一个数组的元素时,允许两个指针作减法运算。其绝对值等于两指针 所指数组元素之间相差的元素个数。如表达式&a[4O]-&a[0]的值为 40.(3)当两个指针指向同一个数组的元素时,这两个指针可以作关系比较(&,&=, ==,&,& =, 。若两指针 p 和 q 指向同一个数组的元素,则 p==q 为真表示 p,q 指向数组的同一个元素; !=) 若 p&q 为真,表示 p 所指向的数组元素的下标小于 q 所指向的数组元素的下标。利用运算符*可引用指针所指对象,*(a+i)表示引用 a+i 所指向的数组元素 a[i] .这样。 (a +i)就是 a[i].对于指向数组元素的指针变量 p,若 p 指向 a[10],*(p+i)表示引用 p+i 所指向 的数组元素 a

我要回帖

更多关于 苹果屏幕出现黑圆圈 的文章

 

随机推荐