黑客学员必须 了解 的C 语言技术 第一章 :C 语言概论C 语言的发展过程当代最优秀的程序设计语言早的C 语言主要是 用 于U N IX 系统 。由于C 语言的强大功能 和各方面的优点逐渐为人们认识,到了八十年代 ,C 开始进入其它操 作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用 。 成为当代最优秀的程序设计语言之一 。C 语言的特点C 语言是一种结构化语 言 。它层次清晰,便于按模块化方式组织 程序 ,易于调试和维护 。C 语言的表现能力和处理能力极强。它不仅 具有丰富的运算符和数据类型,便于实现各类复杂的数据结构 。它还 可 以直接访 问内存 的物理地址,进行位(bit)一级的操作 。由于C 语言 实现了对硬件 的编程操作,因此C 语言集高级语言和低级语言的功能 于一体 。既可用于系统软件 的开发,也适合于应用软件 的开发。止匕外, C 语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类 各型计算机上,从而形成 了多种版本 的C 语言 。C 语言版本目前最流行的C 语言有 以下儿种 :?Microsoft C 或称 MS C?Borland Turbo C 或称 Turbo C?ATT C这 些C 语言版本不仅实现了 AN SI C 标准 ,而且在此基础上 各 自作 了一些扩充 ,使之更加方便、完美 。面 向对象的程序设计语言在 C 的基础上,一九八三年又 由贝尔实验室 的Bj arne Strou-strup 推出了 C。 C进一步扩充和完善了 C 语言,成为一种面 向对象 的 程 序 设 计 语 言 。 C目 前 流 行 的 最 新 版 本 是 Borland C 4 .5,Sym antec C 6.1,和 Microsoft VisualC2 .0 。C 提出了一些 更为深入 的概念 ,它所支持的这些面 向对象的概念容易将 问题空间直 接地映射到程序空间,为程序员提供 了一种与传统结构程序设计不同 的思维方式和编程方法 。因而也增加 了整个语言的复杂性,掌握起来 有一定难度 。C 和 C但是 ,C 是 C的基础 ,C语 言和c 语言在很多方面是兼容的。 因此,掌握了 C 语言,再进一步学习C就能以一种熟悉的语法来学 习面 向对象的语言,从而达到事半功倍的 目的。C 源程序的结构特点为 了说 明C 语言源程序结构的特点,先看 以下几个程序 。这几个 程 序 由简 到难 ,表现 了C 语言源程序在组成结构上的特点。虽有 关 内容还未介绍,但可从这些例子 中了解到组成一个C源程序的基 本部分和书写格式。main()printf(c 语言世界 www .vcok .com ,您好 !\n);m a in 是主函数的函数名,表示这是一个主函数。每 一个C 源程序都必须有,且只能有一个主函数(m a in 函数)。函数调用语句, p r in t f 函数的功能是把要输出的内容送到显示器去显示。p r in t f 函数是 一个由系统定义的标准函数,可在程序中直接调用。#include#includemain()double x,s;printf(input numbe亡\n );scanf(%lf,x);s=sin(x);printf(sine of % If is %lf\n ,x,s);) 每行注释in c lu d e 称为文件包含命令扩展名为. h的文件也称为头文件或首 部文件定义两个实数变量,以被后面程序使用显示提示信息从键盘获得一个实数x求 X 的正弦,并把它赋给变量S显示程序运算结果m a in 函数结束程序的功能是从键盘输入一个数x, 求 x 的正弦值, 后输出结 果。在 m ain 。之前的两行称为预处理命令 详(见后面)。预处理命令还 有其它几种,这里的in c lu d e 称为文件包含命令,其意义是把尖括号 或引号。 内指定的文件包含到本程序来,成为本程序 的一部分 。被 包含的文件通常是 由系统提供的,其扩展名为.h 。因此也称为头文件 或首部文件 。C 语言的头文件 中包括 了各个标准库函数的函数原型。 因此,凡是在程序 中调用一个库函数时,都必须包含该函数原型所在 的头文件 。在本例 中,使用了三个库函数:输 入 函数 s c a n f , 正弦函 数 sin,输 出函数printfo s in 函数是数学函数,其头文件为m ath .h 文件 , 因此在程序 的主函数前用in c lu d e 命令包含了 math .hosc an f 和 printf 是标准输入输 出函数,其 头 文 件 为 s t d i o .h ,在主 函数前也用include 命令包含了 std io .h 文件 。需要说明的是,C 语 言规 定对sc an f 和 p r in t f 这两个函数可以省 去对其头文件 的包含命令 。所 以在本例 中也可 以删去第二行的包含命 令#inclu de 。同样,在 例 1 . 1 中使用了 p r in t f 函数,也省略了包含命令 。在例题 中的主函数体 中又分为两部分,一部分为说明部分,另一 部分执行部分 。说明是指变量的类型说明。例题 中未使用任何变量, 因此无说明部分。C 语言规定,源程序 中所有用到的变量都必须先说 明,后使用 ,否则将会 出错 。这一点是编译型高级程序设计语言的一 个特点,与解释型 的B A SIC 语言是不 同的。说 明部分是C 源程序结 构中很重要的组成部分 。本例 中使用 了两个变量x , s , 用来表示输入 的 自变量和s i n 函数值 。由于 s i n 函数要求这两个量必须是双精度浮 点型,故用类 型说 明符d o u b l e 来说明这两个变量 。说明部分后的四 行为执行部分或称为执行语句部分,用 以完成程序 的功能。执行部分 的第一行是输 出语句,调 用p rintf 函数在显示器上输 出提示字符串, 请操作人员输入 自变量x 的值 。第二行为输入语句,调 用 scan f 函数, 接受键盘上输入的数并存入变量x 中。第三行是调用s in 函数并把函 数值送到变量s 中。第 四行是用p r in t f 函数输 出变量s 的值WhatsApp网页版,即x 的 正弦值 。程序结束 。printf(input numberAn);scanf(%lf,C 10F 10x);s=sin(x);printf(sine of %lfis %lf\n;C10F 10x,s);运 行 本 程 序 时 ,首 先 在 显 示 器 屏 幕 上 给 出提 示 串input n u m b er ,这是 由执行部分的第一行完成 的。用户在提示下从键盘上键 入某一数 ,如 5, 按下回车键 ,接着在屏幕上给出计算结果。输入和输出函数在前两个例子 中用到 了输入和输 出函数sc an f和 p r in t f ,在第三 章 中我们要详细介绍。这里我们先简单介绍一下它们的格式,以便下 面使用 。sc an f和 p rin t f这两个函数分别称为格式输入函数和格式输 出函数 。其意义是按指定的格式输入输 出值 。因此 ,这两个函数在括 号 中的参数表都 由以下两部分组成:“格式控制 串”,参 数 表 格 式控制串是一个字符 串,必须用双引号起来,它表示了输入输出量 的数据类型。各种类型的格式表示法可参阅第三章 。在 p rintf 函数中 还可 以在格式控制 串内出现非格式控制字符,这时在显示屏幕上将原 文照印。参数表 中给出了输入或输 出的量 。当有多个量 时,用逗号间 隔。例如 :printf(sine of %lf is %lf\n,x,s);其中%I f 为格式字符,表示按双精度浮点数处理 。它在格式 串中两次现,对应 了x 和 s 两个变量 。其余字符为非格式字符则照原 样输出在屏幕上int max(int a,int b);main() {int x,y,z; printf(input two numbers:\n );scanf(%d%d,x,y); z=max(x,y); printf(m axmum=%d,z); ) int max(int a,int b) { if(ab)return a;else return b; ) 此函数的功能是输入两个整数,输 出其 中的大数 。 /*函数说明*/ /*主函数*/ /*变量说明*//*输 入 x ,y 值*//*调 用m ax 函数*//*输出*//*定 义m ax 函数*//*把结果返 回主调函数*/上面例 中程序 的功能是 由用户输入两个整数,程序执行后输 出其中较大的数 。本程序 由两个函数组成,主 函数 和m a x 函数 。函 数之 间是并列关系 。可从主函数 中调用其它函数 。m a x 函数的功能 是 比较两个数 ,然后把较大 的数返 回给主函数 。m a x 函数是一个用 户 自定义函数 。因此在主函数中要给出说明 程(序第三行)。可见 ,在 程序 的说明部分 中,不仅可 以有变量说明,还可 以有函数说明。关于 函数的详细 内容将在第五章介绍。在程序的每行后用/*和*/起来的 内容为注释部分,程序不执行注释部分 。上例 中程序 的执行过程是,首先在屏幕上显示提示 串,请用户输 入两个数 ,叵I车 后 由sc an f 函数语句接收这两个数送入变量x ,y 中, 然 后 调 用m a x 函数,并 把 x ,y 的值传送给m a x 函数 的参数a ,b o 在 m a x 函数中比较a ,b 的大小,把大者返回给主函数的变量z, 最后在 屏幕上输出z 的值。C 源程序的结构特点1 .一个C 语言源程序可以由一个或多个源文件组成。2 .每个源文件可由一个或多个函数组成。3 .一个源程序不论由多少个文件组成,都有一个且只能有一个 m a in 函数,即主函数。4 .源程序中可以有预处理命令(in c lu d e 命令仅为其中的一种),预 处理命令通常应放在源文件或源程序的最前面。5 .每一个说,每一个语句都必须以分号结尾。但预处理命令,函 数头和花号 “}”之后不能加分号。6 .标识符,关键字之间必须至少加一个空格以示间隔。若已有明 显的间隔符,也可不再加空格来间隔。 书写程序时应遵循的规则从书写清晰,便于 阅读 ,理解 ,维护的角度 出发,在书写程序时 应遵循 以下规则:1 .一个说明或一个语句 占一行。2 .用 {} 起来 的部分 ,通常表示 了程序 的某一层次结构 。 {}一 般与该结构语句的第一个字母对齐,并单独 占一行。3 .低一层次的语句或说 明可 比高一层次的语句或说 明缩进若干 格后书写 。以便看起来更加清晰,增加程序 的可读性 。在编程时应力 求遵循这些规则,以养成 良好的编程风格 。C 语言的字符集字符是组成语言的最基本的元素 。C 语言字符集 由字母 ,数字 , 空格 ,标点和特殊字符组成 。在字符常量 ,字符串常量和注释 中还可 以使用汉字或其它可表示的图形符号。1 .字母小写字母a〜 z 共 2 6 个 ,大写字母A 〜 Z 共 2 6 个2 .数字 0 〜 9 共 10 个3 .空 白符 空 格 符 、制表符、换行符等统称为空 白符 。空白符只 在字符常量和字符常量 中起作用 。在其它地方 出现时,只起间隔作 用 , 编译程序对它们忽略。因此在程序 中使用空 白符与否,对程序 的编译不发生影响,但在程序 中适当的地方使用空 白符将增加程序的 清晰性和可读性 。4.标点和特殊字符C 语言词汇在 C 语言中使用的词汇分为六类 :标识符 ,关键字 ,运算符 ,分 隔符,常量WhatsApp网页版,注释符等 。1.标识符在程序 中使用的变量名、函数名、标号等统称为标识符 。除库函 数 的函数名 由系统定义外,其余都 由用户 自定义 。C规定 ,标识符 只能是字母(A〜 Z ,a〜 z) 、数字(0〜 9) 、下划线 ()组成 的字符WhatsApp网页版,并 且其第一个字符必须是字母或下划线 。以下标识符是合法的:a,x, 3x,BOOK l,sum5以下标识符是非法的:3 s 以数字开头s * T 出现非法字符*- 3 x 以减号开头b ow y - 1 出现非法字符-(减号)在使用标识符时还必须注意 以下几点:(1)标 准 C 不限制标识符的长度 ,但它受各种版本 的C 语 言编译 系统限制,同时也受到具体机器的限制 。例 如在某版本C中规定标 识符前八位有效,当两个标识符前八位相 同时,则被认为是同一个标 识符 。(2)在标识符 中,大小写是有区别的。例 如 B O O K 和 b o o k 是两 个不同的标识符 。(3)标识符虽然可 由程序员随意定义 ,但标识符是用于标识某个 量 的符号 。因此,命名应尽量有相应的意义,以便阅读理解,作 到 “顾 名思义 ”。2 .关键字关键字是 由C 语言规定的具有特定意义的字符,通常也称为保 留字。用户定义的标识符不应与关键字相 同。C 语言的关键字分为以 下几类 :( 1)类型说明符用于定义、说 明变量、函数或其它数据结构 的类型如前面例题 中用到 的int ,doub le等(2)语句定义符用于表示一个语句的功能。如 例 1 .3 中用到的if e l s e 就是条件语 句 的语句定义符 。(3)预处理命令字用于表示一个预处理命令 。如前面各例 中用到的includeo3 .运算符C 语言中含有相当丰富的运算符 。运算符与变量 ,函数一起组成 表达式 ,表示各种运算功能。运算符 由一个或多个字符组成 。4 .分隔符在 C 语言 中采用的分隔符有逗号和空格两种 。逗号主要用在类型 说明和函数参数表 中,分隔各个变量 。空格多用于语句各单词之间, 作间隔符 。在关键字 ,标识符之间必须要有一个 以上的空格符作间隔, 否则将会 出现语法错误,例 如把in t a ;写 成 inta;C编译器会把in t a 当 成一个标识符处理,其结果必然 出错 。5 .常量C 语言中使用的常量可分为数字常量、字符常量 、字符常量 、 符号常量 、转义字符等多种 。在第二章中将专 门给予介绍。6 .注释符C 语 言 的注释符是 以 “/*”开 头 并 以 “*/”结尾 的。在 “/*” 和 “*/”之间的即为注释 。程序编译时,不对注释作任何处理 。注释 可 出现在程序 中的任何位置 。注释用来 向用户提示或解释程序 的意 义 。在调试程序 中对暂不使用的语句也可用注释符括起来,使翻译跳 过不作处理,待调试结束后再去掉注释符 。 第二章:数据类型、运算符 、表达式C 语言的数据类型在第一课 中,我们 已经看程序 中使用的各种变量都应预先加 以 说 明,即先说明,后使用 。对变量的说明可 以包括三个方面:?数据类型?存储类型?作用域在本课 中,我们只介绍数据类型说明。其它说明在 以后各章 中陆续介绍。所谓数据类型是按被说明量的性质,表示形式,占据存 储空间的多少 ,构造特点来划分的。在 C 语言中,数据类型可分为 : 基本数据类型,构造数据类型,指针类型,空类型四大类 。1 .基本数据类型基本数据类型最主要的特点是,其值不可 以再分解为其它类型。 也就是说,基本数据类型是 自我说明的。2 .构造数据类型构造数据类型是根据 已定义的一个或多个数据类型用构造 的方法来定义的。也 就是说 ,一个构造类型的值可 以分解成若干个 “成员 ”或 “元素 ”。 每 个 “成员 ”都是一个基本数据类型或又是一个构造类型。在 C语 言中,构造类型有 以下儿种 :?数组类型?结构类型?联合类型3.指针类型指针是一种特殊 的,同时又是具有重要作用的数据类型。其值用 来表示某个量在 内存储器 中的地址 。虽然指针变量的取值类似于整型 量 ,但这是两个类型完全不同的量,因此不能混为一谈 。4.空类型在 调用函数值时,通常应 向调用者返 回一个函数值 。这个返回的函数值 是具有一定的数据类型的,应在函数定义及函数说明中给 以说明,例 如在例题 中给 出的m a x 函数定义中,函数头为: int max(int a,int b); 其 中 “ int ” 类型说 明符即表示该函数的返 回值为整型量 。又如在例 题 中,使用 了库 函数s i n , 由于系统规定其函数返回值为双精度浮点 型 ,因此在赋值语句$=$巾(刈冲,s也必须是双精度浮点型,以便与 s i n 函数的返 回值一致 。所 以在说 明部分,把 s 说 明为双精度浮点型。 但是 ,也有一类函数 ,调用后并不需要 向调用者返 回函数值 , 这种 函数可 以定义为 “空类型”。其类型说 明符为v o i d o 在第五章函数中 还要详细介绍 。在本章中,我们先介绍基本数据类型中的整型、浮点 型和字符型。其余类型在 以后各章中陆续介绍。对于基本数据类型量 ,按其取值是否可改变又分为常量和变量两 种 。在程序执行过程 中,其值不发生改变的量称为常量 ,取值可变的 量称为变量 。它们可与数据类型结合起来分类 。例如 ,可分为整型常 量 、整型变量 、浮点常量 、浮点变量、字符常量、字符变量、枚举常 量 、枚举变量 。在程序 中,常量是可 以不经说明而直接引用的,而变 量则必须先说明后使用 。整型量整型量包括整型常量、整型变量 。整型常量就是整常数 。在 C 语 言中,使用的整常数有八进制、十六进制和十进制三种 。整型常量1 .八进制整常数八进制整常数必须 以0 开头 ,即 以0 作为八进制 数的前缀 。数码取值为0〜7 。八进制数通常是无符号数 。以下各数是合法的八进制数 :015(十 进 制 为 13)010 1(十 进 制 为 65)0177777(十进制为 65535)以下各数不是合法的八进制数:256(无前缀0) 03A2(包含了非八进制数码 ) -0127(出现了负号)2 .十六进制整常数十六进制整常数 的前缀为0 X 或 Ox。其数码取值为 。〜9, A〜F 或 a-fo以下各数是合法的十六进制整常数:0X2A 十(进制为42)0XA0十(进 制 为 160)OXFFFF十(进 制 为 65535)以下各数不是合法的十六进制整常数 :5A 无(前缀OX)0X3H 含(有非十六进制数码)3 .十进制整常数十进制整常数没有前缀。其数码为0〜 9 。以下各数是合法的十进制整常数:237 -568 65535 1627以下各数不是合法的十进制整常数:023 (不能有前导0)23D 含(有非十进制数码)在程序中是根据前缀来区分各种进制数的。因此在书写常数时不 要把前缀弄错造成结果不正确。4 .整型常数的后缀在1 6 位字长的机 器上,基本整型的长度也为1 6 位 ,因此表示的数的范围也是有限定 的。十进制无符号整常数的范围为0 - 6 5 5 3 5 , 有符号数为-32768〜 32767o进制无符号数的表示范围为0〜 0177777 。十六进制无符 号数的表示范围为0X 0〜 OXFFFF 或 0x0〜 OxFFFF 。如果使用的数超 过了上述范围,就必须用长整型数来表示。长整型数是用后缀“ L ” 或 T来表示的。例如:十 进 制 长 整 常 数 158L十( 进 制 为 158) 358000L十(进制为 -358000)进 制 长 整 常 数 012L十( 进 制 为 10) 077L十( 进 制 为 63) 0200000L 十(进制为 65536)十六进制长整常数0X 15L 十(进制为2 1) 0XA5L 十(进 制 为 165) 0X 10000L 十(进制为 65536)长 整 数 15 8L 和 基 本 整 常数 15 8 在数值上并无区别 。但对 1 5 8 L , 因为是长整型量,C 编译系统将为它分配4 个字节存储空间。 而 对 1 5 8 , 因为是基本整型,只分配2个字节的存储空间。因此在运 算和输 出格式上要予以注意,避免出错 。无符号数也可用后缀表示, 整型常数的无符号数的后缀为“ U ”或u ” 。例如 :358u,0x38Au,235Lu 均为无符 号数 。前 缀 ,后缀可 同时使用 以表示各种类 型 的数 。如 0XA5LU表示十六进制无符号长整数A 5 , 其十进制为 165o 整型变量整型变量可分为 以下几类 :1.基本型类型说明符为i n t , 在 内存中占2 个字节,其取值为基本整常数。2 .短整量类型说明符为short in t 或 sh ortCU O F l 。所占字节和取值范围均 与基本型相同。3 .长整型类型说明符为long in t 或 long , 在 内存中占4 个字节,其取值为 长整常数。4 .无符号型类型说明符为un sign ed 。无符号型又可与上述三种类型匹配而构成:( 1)无符号基本型类型说明符为unsigned in t 或un sign edo(2)无符号短整型类型说明符为unsigned short(3)无符号长整 型类 型说 明符为unsigned long 各种无符号类型量所 占的内存空间字节数与相应 的有符号类型量相 同。但 由于省去了符号位 ,故不能表示负数 。 下表列出了 Turbo C 中各类整型量所分配的内存字节数及数的表示范围。类型说明符数的范围分配字节数int-32768〜32767short int-32768-32767signed int-32768〜32767unsigned int0-65535long int -2 147483648〜2 147483647unsigned long0-4294967295整型变量的说明变量说 明的一般形式为: 类 型说 明符变量名标识符 ,变量名标 识符 ,…;例如 :int a,b,c; (a,b,c 为整型变量 )long x,y; (x ,y 为长整型变量 )unsigned p,q; (p ,q 为无符号整型变量 )在书写变量说 明时,应注意 以下几点:1 .允许在一个类型说明符后,说明多个相 同类型的变量 。各变量 名之间用逗号间隔。类型说明符与变量名之间至少用一个空格 间隔。2