资源描述
C语言基础复习
第一章. 程序设计和C语言
一、何为计算机语言? 人与计算机交流的工具。
二、计算机语言经历了四代发展:第一代:机器语言(低级语言)。第二代:汇编语言(符号语言,面向机器)。第三代:高级语言(面向问题)。第四代:甚高级语言(面向对象或面向问题)。
三、C语言的特点:(1)语言简洁、紧凑,使用方便、灵活。程序书写形式自由。共有32个关键字(附录II),9种控制语句。
(2)运算符丰富,包括算术、逻辑、逗号运算、移位运算等等,多达44种的运算符(附录III)。
(3)数据结构丰富。有整型、实型、字符型、数组类型,指针类型、结构类型、共同体类型等等。
(4)具有结构化的控制语句,函数模块化。
(5) 语法限制不太严格,程序设计自由度大。
(6) C语言能进行位操作,实现汇编语言的大部分功能,可以直接对硬件进行操作。
(7)生成代码质量高,程序执行效率高。
(8)可移植性好。
四、C的性质:
(1)C程序是由函数构成的。每个程序由一个或多个函数组成,其中必须有且仅有一个主函数main( )。函数容易实现程序的模块化.。
(2)一个可执行的C语言程序总是从main函数开始执行,而不论其在整个程序中的位置如何。
(3)3.每条语句或数据定义的最后必须有一个分号“;”。
说明:在以下三种情况下不允许有分号:
a.在右花括号“}”后面不使用分号;
b.所定义的函数的名称后面不使用分号;
c.预处理语句后面不使用分号。
(4)C对输入输出实行函数化。
(5)C程序书写格式自由,一行内可以写几个语句,一个语句也可以分写在多行上。
(6)可用/*……*/对C程序中的任何部分作注释,注释可以写在程序的任何位置上,“/*”与“*/”也可不在同一行上。
(7)也可用“//”。 本行中“//”之后的文字都视为注释。
(8)在C语言中,大小写字母是有区别的。(C语言习惯用小写字母)。
五、函数的一般结构
任何函数(包括主函数main())都是由函数说明和函数体两部分组成。
其一般结构如下:
[函数类型] 函数名(函数参数表) 函数说明部分
{
函数体部分
说明语句部分;
执行语句部分;
}
1.函数说明
函数说明由三部分组成:
(1)函数类型(可缺省)
(2)函数名
(3)函数参数表,其中函数参数表的格式为:
[数据类型 形参, 数据类型 形参2……]
例如,例1.3中的函数max(),其函数说明各部分如下所示。
函数类型 函数名 函数参数表
↓ ↓ ↓
int max ( int x , int y )
2.函数体
函数体一般由说明语句和可执行语句两部分构成。
在函数说明部分的下面,一对 { }内的部分。大括号必须配对使用 。
(1)说明语句部分
说明语句部分由变量定义、自定义类型定义、自定义函数说明、外部变量说明等组成。
int a, b;
float k, h;
(2)可执行语句,一般由若干条可执行语句构成。
六、C语言的关键字和语句
C语言的关键字共有32个,可分为四类。
(1)数据类型关键字(12个):
char, double, enum, float, int, long, short, signed, struct, union, unsigned, void
(2)控制语句关键字(12个):
break, case, continue, default, do, else, for, goto, if, return, switch, while
(3)存储类型关键字(4个):
auto, extern, register, static
(4)其它关键字(4个):
const, sizeof, typedef, volatile(易变)
七、 C语言的语句
按照语句功能或构成的不同,可将C语言的语句分为五类。
(1) 函数调用语句
函数调用语句由一次函数调用加一个分号(语句结束标志)构成。
例如 printf("This is a C statement.");
(2) 表达式语句
表达式语句由表达式后加一个分号构成。
例如在赋值表达式后加一个分号构成的赋值语句。
num=5; 是一个赋值语句
num=5 只是一个赋值表达式
(3) 控制语句
控制语句完成程序中特定的控制功能。 C 语言只有9 条控制语句,又可细分为三种:
① 选择结构控制语句
if()~else~, switch()~
② 循环结构控制语句
do~while(), for()~, while()~,
break, continue
③ 其它控制语句
goto , return
(4)空语句
空语句仅由一个分号构成: ;
空语句什么操作也不执行。
(5)复合语句
复合语句是由大括号括起来的一组语句构成,右括号后不需要分号。
复合语句格式:{ 语句组 }
例如:{ a=a*3; b=a+b; c=a*b;}
复合语句的性质:
① 复合语句在语法上和单一语句使用相同,即单一语句可以出现的地方,也可以使用复合语句。
② 复合语句可以嵌套,即复合语句中也可出现复合语句。
八、C语言源程序书写格式
1. C语言程序使用英文小写字母书写。 C语言区分字母大小写,大写字母一般符号常量或特殊用途使用。
2. 所有语句都必须以分号“ ; ”结束,作为语句之间的分隔符。
函数的最后一个语句也必须以分号“ ; ”结束。
3. 程序行的书写格式自由。
既允许1行内写几条语句,也允许1条语句分写在几行上。
4. C语言程序不使用行号。
5.必须配对使用的符号:
例如注释符号/* */ 、函数体的起止标识符({ }花括号)、圆括号( )等。
在输入时,可连续输入这些起止标识符,然后再在其中进行插入来完成内容的编辑。
第二章 . C语言数据类型
C语言提供的数据结构,是以数据类型形式出现的。
1.基本类型
整型、实型(又称浮点型)、字符型、空类型
2. 构造类型
数组类型 、结构类型 、共用类型、文件类型
3. 指针类型
4. 用户自定义型
C语言中的数据,有常量和变量之分,它们分别属于上述这些类型。
一、 数值的定点表示和浮点表示
1. 定点数:不带指数部分的数
2. 浮点数:由数字(尾数)和指数(阶码)两部分表示
如:3.14159e0,0.314159e+1,0.0314159e+2,31.4159e-1,314.159e-2
注:计算机中凡是实数都以浮点形式存储
二、整型数据在内存中的存放形式
int i;
i=10;
10=(1010)2
有符号整数 (补码表示法:便于加减运算)
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:
正数:反码与原码相同
负数:符号位为1,其余位对原码取反
补码:
正数:原码、反码、补码相同
负数:最高位为1,其余位为原码取反,再对整个数加1
例如:
-10补码的表示法为:10的原码 0000 0000 0000 1010
10取反 1111 1111 1111 0101
+1 1111 1111 1111 0110
∴ -10的补码 1111 1111 1111 0110
三、各种进制之间的转换
①二进制、八进制、十六进制转换成十进制
方法:按权相加
②十进制转换成二进制、八进制、十六进制
方法:连续除以基,从低到高记录余数,直至商为0。
③二进制与八进制之间的转换
二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制
八进制转换成二进制:用3位二进制数代替每一位八进制数
④二进制与十六进制之间的转换
二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制
十六进制转换成二进制:用4位二进制数代替每一位十六进制数
例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16
(4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2
四.字节(Byte)、字word
字节是计算机中的最基本的存储单位,是指8位二进制码所占的存储空间称为一个字节(Byte),每个字节都有一个地址。
字是指计算机一次可以处理的最大二进制位数,称一个机器字,简称字。一个字所包含的二进制数的位数称为字长。
五、类型宽度与取值范围
1. 位: bit 字节:byte (B)
1 B = 8 bit
2. 带符号整数范围:-2^(n-1)~2^(n-1)-1
不带符号整数范围:0~2^n-1
3. 测定数据类型所占存储空间长度
sizeof (类型表示符) 例如: sizeof(char) size(1.23)
2.2 数据常量
一、 整型常量
三种进制:八进制、十六进制和十进制
八进制整常数:
八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。
十六进制整常数 :
十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。
十进制整常数:
十进制整常数没有前缀。其数码为0~9。
二、 整型常量类型的确定
整型常数的后缀在16位字长的机器上,基本整型的长度也为16位,
因此表示的数的范围也是有限定的。
十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。
八进制无符号数的表示范围为0~0177777。
十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF
如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。例如:
十进制长整常数 158L (十进制为158)
十进制长整常数 -358000L (十进制为-358000)
八进制长整常数 012L (十进制为10)
八进制长整常数 077L (十进制为63)
八进制长整常数 0200000L (十进制为65536)
十六进制长整常数 0X15L (十进制为21)
十六进制长整常数 0XA5L (十进制为165)
十六进制长整常数 0X10000L (十进制为65536)
三、 字符类型及其常量
字符常量
(1)可打印字符常量
用一对单引号括起来的一个字符,是可打印字符常量,例如‘a’、‘A’、‘? ’、’3’都是可打印字符常量。
注:单撇号只是字符与其他部分的分隔符,输出字符常量时不输出单撇号。
不能用双撇号代替单撇号,”a”不是字符常量。
单撇号内的字符不能是单撇号或反斜杠。
(2) 一个字符型数据,既可以字符形式输出,也可以整数形式输出。
转义字符
C语言还允许用一种特殊形式的字符常量,就是一个以“\”开头的字符序列(包括一些不可打印字符常量),这种反斜杠字符常量又称转义字符。
注:反斜杠后面跟一个字母代表一个控制字符(不可打印字符)
\\ 表示“\”, \’代表撇号字符
\后跟1~3位八进制代表ASCII码为该八进制的字符
\x后跟 1~2位十六进制数代表ASCII码为该十六进制的字符
以“ \”开头的字符在printf 函数中控制输出格式:
\n 换行
\t 横向跳格(下一个输出区< 8列 >)
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜杠字符 \
\’ 单引号 ’
\ddd 1到3位8进制数所代表的字符。如:‘\101’=‘A’
\xhh 1到2位16进制数所代表的字符。
允许对字符数据进行算术运算,此时就是对它们的ASCII码值进行算术运算。
字符串常数
字符串常量的概念和字符串长度
字符串常量:是用一对双引号括起来的若干字符序列。
字符串长度:字符串中字符的个数称为。
空串: 长度为0的字符串(即一个字符都没有的字符串),表示为“ ” (一对紧连的双引号)。
例:“How do you do.” 长度为14(空格也是一个字符)
“Good morning.” 长度为13
字符串的存储
C语言规定:
在存储字符串常量时,由系统在字符串的末尾自动加一个‘\0’作为字符串的结束标志。如果有一个字符串为“CHINA”,则它在内存中的实际存储如下所示:
C H I N A \0
最后一个字符'\0'是系统自动加上的,它占用6字节而非5字节内存空间。
字符常量 ' A '与字符串常量 " A "的区别:
(1)定界符不同:
字符常量使用单引号'A' ,
而字符串常量使用双引号 " " ;
(2)长度不同:
字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数;
(3)存储要求不同:
字符常量存储的是字符的ASCII码值,
而字符串常量,除了要存储有效的字符外,还要存储一个结束标志 ' \0 ' 。
实型常量
1.实型常量(实数,又称浮点数)表示形式:
(1)十进制形式
例如: 3.14 、 9.8
(2)指数形式
<尾数>E(e)<整型指数>
例如: 3.02E+5
34.42367750E+7
实型常量分为 float 型、 double 型和long double型。
E左边可以是整数也可以是小数,右边必须是整数
变量的声明
变量:其值可以被改变的量,用标识符表示。
一般格式:数据类型 [变量1,变量2,…,变量n];
决定分配字节数
和数的表示范围
合法的标识符
变量必须先声明后使用
原因:
编译程序不能翻译未定义的变量;
要根据变量的类型确定存储单元的数量;
要根据变量的类型决定允许的操作方式;
变量定义一般放在函数开头
变量占用字节数可用:
sizeof(类型标识符)测量。
整型变量
整型变量的声明
int a,b; /*指定变量a、b为整型*/
unsigned int c,d; /*指定变量c、d为无符号短整型*/
long e,f; /*指定变量e、f为长整型*/
实型变量
实型变量的声明
float x,y; /*指定变量x、x为单精度实型*/
double m,n; /*指定变量m、n为双精度实型*/
字符型变量
字符型变量的声明
char c1,c2; /*指定变量c1、c2为有符号字符型*/
unsigned nc1,nc2; /*指定变量nc1、nc2为无符号字符型*/
字符变量在内存中占一字节。
字符变量存放字符的ASCII码。
char型与int型数据间可进行算术运算。
在C语言中,没有字符串变量,字符串用字符数组存放。
2.2.5 变量和对变量的赋值
在C语言中可以在声明变量的同时指定其初值(初始化)。
2.3 运算符与表达式
运算(也叫做操作)就是对数据的加工。
三大运算符:算术运算、关系与逻辑运算、位操作运算。
13类
2.3.1 算术运算
(一) 双元算术运算
优先级:* / % 高于 + -,结合方向为“从左至右”
赋值运算符
符号:= ,自右向左结合
格式:变量标识符 = 表达式
作用:将一个常量或表达式赋给一个变量。
(二) 自反算术赋值运算符
(三) 自加和自减运算
作用:使变量值加1或减1
种类:
前置 ++i,--i (先执行i=i+1或i-1,再使用i值)
后置 i++,i-- (先使用i值,再执行i=i+1或i-1
(四) 正负号运算
正负号运算符为+(正号)和-(负号),它们是一元运算符,其优先级别高于*、/运算符。结合方向是从右向左。
如:-a*b; -a*-b; 相当于(-a)*b; (-a)*(-b)
2.3.2 关系运算、逻辑运算与条件运算
(一) 关系运算
关系运算符: >; <; >=; <=; ==; !=;
关系表达式的值:是逻辑值“真”或“假”,用"1"和"0"表示。
优先级:算术运算 > 关系运算 > 赋值运算
注意:
(1) 数学中的表达式a≤x≤b和c语言中的表达式 a<=x<=b的含义不同。若a=0; b=0.5; x=0.3; 则 a<=x<=b的值为0
(2) 表达式 5>2>7>8 在数学中是非法的,但在c语言中是合法的表达式。
(3) 在c语言中关系表达式是整形表达式,可与其它数据进行运算。
例如:int i = 1, j = 7, a; a = i + ( j % 4 != 0);
(4)字符数据的比较按照该字符的ASCII码进行。
例如:'a' > 15 结果为 1
'A' > 100 结果为 0
(二) 逻辑运算
三种逻辑运算:&& (逻辑与)、|| (逻辑或)、! (逻辑非)
C语言中,运算量: 0 表示“假”;
非0 表示“真”;
运算结果: 0 表示“假”;
1 表示“真”;
优先级:
!、++、-- >算术运算符 >关系运算符 >&& ,|| >赋值
例如:
a = 4; b = 5; 0
!a 1
a && b 1
a || b 1
!a || b 1
4 && 0 || 2 1
5 > 3 && 2 || 8 < 4 - !0 1
'c' && 'd' 1
短路特性:
逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
a && b && c 只在a为真时,才判别b的值;
只在a、b都为真时,才判别c的值。
a || b || c 只在a为假时,才判别b的值;
只在a、b都为假时,才判别c的值。
(三) 条件运算
一般形式:exp1 ?exp2 :exp3
x ? 'a' : 'b'
(a == b) ? 'Y' : 'N'
(x % 2 == 1) ? 1 : 0
(x >= 0) ? x: -x
(c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c
条件运算符可嵌套:x>0?1:(x<0?-1:0)
自右向左结合:a>b?a:c>d?c:d Û a>b?a:(c>d?c:d)
2.5.1 printf 函数(格式输出函数)
作用:格式化输出任意数据列表。
格式:printf(格式控制参数,输出项1,输出项2,…);
包含两种信息:
① %[修饰符]格式字符: 用于指定输出格式
② 普通字符或转义序列:原样输出
2.5.2 scanf 函数
格式:scanf(格式控制参数,变量地址1,变量地址2,…)
格式控制参数的组成:
%[修饰符]格式字符
域宽,一个正整数,指定输入所占列宽
m
表示对应输入量不赋给一个变量 (虚读)
*
用于短整型数(%hd、%ho、%hx)
h
用于长整型数(%ld、%lo、%lx)或double型实数(%lf、%le)
l
修饰符
scanf的格式字符
使用scanf函数的几个注意事项
1. scanf()中不使用%u说明符。对unsigned型数据,以%d、%o、%x格式输入。
2. 输入实数不能规定精度,如 scanf("%7.2f",&a);
3. scanf( )中的变量必须使用地址
2.5.3 getchar 函数与 putchar 函数
字符输入函数 getchar( )
功能:从键盘上接收单个字符
说明:无参数;执行到getchar函数时程序暂停运行,等待从键盘上输入一个字符,再回车;通过赋值语句将函数的返回值送到一字符型变量中。
函数格式:ch = getchar( );
字符输出函数 putchar( )
功能:将所带的字符型变量的内容或字符常量输出到显示器屏幕的当前光标处
函数格式:putchar(字符常量);
注:字符也可以是转义字符
循环控制
用while语句实现循环
while语句用来实现“当型”循环结构。
一般形式:
while (表达式) 语句
当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。
注意:
(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。
(2)在循环体中应有使循环趋向于结束的语句。如果无此语句,则i的值始终不改变,循环永不结束。
用do-while语句实现循环
do-while语句的特点:先执行循环体,然后判断循环条件是否成立。
一般形式: do
循环体语句
while (表达式);
执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。
while语句和用do-while语句的比较:
在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。
用for 语句实现循环(核心)
C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
一般形式:
for(表达式1;表达式2;表达式3) 语句
for语句的执行过程:
(1) 先求解表达式1。
(2) 求解表达式2,若其值为真(值为非0),则执
行for语句中指定的内嵌语句,然后执行下
面第(3)步。若为假(值为0),则结束循环,
转到第(5)步。
(3) 求解表达式3。
(4) 转回上面第(2)步骤继续执行。
(5) 循环结束,执行for语句下面的一个语句
for语句等价于下列语句:
表达式1;
while (表达式2)
{ 语句;
表达式3;
}
说明:
① for(i=0;(c=getchar())!=′\n′;i+=c);
在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达式的值是否不等于′\n′(换行符),如果不等于′\n′,就执行循环体。
注意:此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本来应在循环体内完成的操作。
几种循环的比较
(1)四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。
(2)在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。
(3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
(4)while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见下节)。而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制。
break语句和continue语句
break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句
一般形式:
break;
注意:break语句不能用于循环语句和switch语句之外的任何其他语句中。
例: float pi=3.14159;
for(r=1;r<=10;r++)
{ area=pi*r*r;
if(area>100) break;
printf(″r=%f,area=%f\n″,r,area);
}
程序的作用是计算r=1到r=10时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area>100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。
continue语句
作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.
一般形式:
continue;
continue语句和break语句的区别
continue语句只结束本次循环,而不是终止整个循环的执行。
while(表达式1) for
{ …
if(表达式2) continue;
…
}0
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
while(表达式1) for
{ …
if(表达式2) break;
…
}
穷举与迭代算法
(一) 穷举(枚举):对问题的所有可能态一一测试,直到找到解或穷尽所有的状态。
(见例题9)
(二) 迭代(递推) :不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程。
(见例题10)
第四章 模块化程序设计
函数
4.1.1 C程序结构
用C语言设计程序的过程就是编写函数的过程。
函数声明:
将函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统。
函数定义与函数声明
main( )
{
…
double new_style(int a, double x);
…
}double new_style(int a, double x)
{
函数定义:
指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,是一个完整的、独立的函数单位。
…
…
}
(一) 函数定义
函数定义的内容:
函数类型(即函数值类型)
函数名
形式参数的数目、类型
函数体内容:
一:函数名-函数名应符合c语言对标识符的规定。
二:形式参数-函数名后面一对括号内的参数。
1用于从主调函数中接收规定类型的数据。
2在函数体中形式参数是可以被引用的,可以输入、输出、赋值和参与运算。
3函数体-分程序结构,变量定义部分+C语句。
4函数的返回-return语句。使流程返回调用函数。
有返回值:return(x); return(x+y); return(x>=0?x:-x);
无返回值:return语句可缺省。
C程序中允许有多个return语句。
5函数的类型-函数定义时指定的类型为函数的类型,也是该函数返回值的类型。
如果不指定函数的类型,那么系统将隐含指定函数为int型(即缺省类型为int型)。
如果函数没有返回值,应将函数指定为void型。
6函数定义的外部性-函数不能嵌套定义,不能定义在另一个函数的内部。
(二) 函数声明
在主调函数中,要对在本函数中将要调用的函数事先声明。
函数声明的一般格式:
函数类型 函数名(类型名 形参1,类型名 形参2,…);
①、float fun(double a, int b, float c);
②、float fun(double, int, float);
③、float fun( ); -不推荐使用
main( )
{
void printstar(int n);
void print_message( );
printstar(20);
被调用函数声明可以放在调用函数开头的部分或该函数调用之前的地方。
print_message( );
printstar(20);
}
void printstar(int n)
{
……
}
void print_message( )
{
……
}
void printstar(int n)
若函数定义在前,调用在后时,函数的声明可以省略。
{
……
}
void print_message( )
{
……
}
main( )
{
printstar(20);
print_message( );
printstar(20);
}
void printstar(int n);
void print_message( );
如果已在所有函数定义之前,在函数的外部已作了函数声明,则在调用函数中就不必对被调用的函数再作声明。
main( )
{
printstar(20);
print_message( );
printstar(20);
}
void printstar(int n)
{
……
}
void print_message( )
{
……
}
函数的嵌套调用
C语言的函数定义都是互相平行的、独立的,即不允许嵌套定义函数;但是,可以嵌套调用函数,即程序在调用一个函数的过程中,该被调函数又可以调用其它函数。
main函数
a 函数
b 函数
调用a函数
调用b函数
结束
返回
返回
函数的递归调用
函数的递归调用概念:
int f2 (int t)
{
int b, c;
……
c=f1(a);
……
return(3+c);
}
int f1(int x)
{
int y, z;
……
z=f2(y);
……
return(z);
}
在函数体内部直接或间接的调用自己,即函数的嵌套调用是函数本身。
int f (int x)
{
int y, z;
……
z = f (y);
……
return(z*z);
}
递归法:
类似于数学证明中的反推法,从后一结果与前一结果的关系中寻找其规律性。
递推法-从初值出发,归纳出新值与旧值间直到最后值为止存在的关系。
要求通过分析得到: 初值+递推公式
编程:通过循环控制结构实现(循环的终值是最后值)
要求通过分析得到: 初值+递归函数
一般形式:
递归函数名 f(参数x)
{ if ( n == 初值 )
结果 = …;
else
结果 = 含 f( x-1 )的表达式;
返回结果(return);
}
在c语言中,存储属性分为4类:1、register 2、auto 3、static 4、extern
寄存器变量、自动变量、静态变量、外部变量的性质
动态、静态局部变量归纳
编译预处理
作用:对源程序编译之前做一些处理,生成扩展C源程序。
◎预处理命令不是c语言的组成部分,或者说它不是c语句,而是c语言编译器的组成部分。
宏替换
(一) 字符串宏替换
用程序中用一个指定的标识符(宏名)来代替一个字符串(宏体)
一般形式为:#define 宏名 [宏体]
#define YES 1
#define NO 0
#define PI 3.1415926
#define PRT printf("Hello,World!")
宏的定义位置:任意(一般在函数外面、源程序的开头)
宏的作用域: 从定义命令处到文件结束
在程序预编译处理过程中,凡是出现宏名的地方,都将用宏体替换掉宏名-宏展开
#define PI 3.14159
#define RADIUS 2.0
double circum()
{ return (2.0*3.14159*2.0);
}
double area()
{ return (3.14159*2.0*2.0);
}
宏定义可嵌套,但不能递归
带参数的宏与函数的区别:
用宏定义和函数有时可以实现同样的功能:
#define MAX(x,y) (x)>(y)?(x):(y)
…….
main()
{ int a,b,c,d,t;
…….
t=MAX(a+b,c+d);
……
}
宏展开:t=(a+b)>(c+d)?(a+b):(c+d);
展开阅读全文