本周学习了函数的声明定义和调用
函数的嵌套调用
全局变量和局部变量
在函数内部的调试
变量的存储类别
C语言的库函数
静态函数与外部函数
外部全局变量与静态全局变量。
函数的声明定义和调用学习总结:
自定义函数先声明,后调用
若先调用后定义:调用前声明
函数的嵌套调用:函数内调用函数
求方程f(x)=x3-5x2+16x-80=0的根的程序 #include<stdio.h>
#include<math.h>
double f(double);
double xpoint(double,double);
double root(double,double);
int main()
{
double x1,x2,f1,f2,x;
do
{
printf("inputx1,x2:");
scanf("%lf%lf",&x1,&x2);
f1=f(x1);
f2=f(x2);
}
while(f1*f2>=0);
x=root(x1,x2);
printf("Arootis%.5f\n",x);
return0;
}
double root(double x1,double x2)
{
double x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)
{
y1=y;
x1=x;
}
else
x2=x;
}
while(fabs(y)>=0.00001);
return x;
}
double xpoint(doublex1,doublex2)
{
doublex;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return x;
}
doublef(doublex)
{
doubley;
y=x*x*x-5*x*x+16*x-80;
return y;
}
函数 功能
intmain() 主控,输入输出
doubleroot(doublex1,doublex2) 求(x1,x2)区间方程的实根
doublexpoint(doublex1,doublex2) 求(x1,f(x1))和(x2,f(x2))的连线与x轴的交点x
doublef(doublex) 求函数f(x)=x3-5x2+16x-80的值
全局变量和局部变量总结
每一个变量都有其有效作用的范围,称为变量的作用域。变量分类(按作用域):
局部变量(localvariable)
在一个函数内部定义的变量只在本函数范围内有效
在复合语句中定义的变量只在本复合语句范围内有效。
全局变量(globalvariable,也称全程变量)
在函数之外定义的变量是外部变量,其有效范围为从定义变量的位置开始到
本源文件结束
不同的函数及作用域中可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。
全局变量作用范围:定义始至文件尾;全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽。
全局变量能增加函数间数据联系的渠道
全局变量会降低程序可读性
限制使用全局变量!
在函数内部的调试
断点(breakpoint)单步执行
每执行一步断一下,看到每一步到底干了些什么
方式:NextLine/StepInto/StepOut等
运行到光标
光标所在位置,实际就是一个“断点”
方式:RuntoCursor
设置断点
任意指定到哪儿断开,想在哪儿停下来,就在哪儿停
相比:单步太烦,运行到光标只能指定一个地方 变量的存储类别
四种存储类别
自动的(auto)
寄存器的(register)
外部的(extern)
静态的(static)
自动变量(autovariable)
例
int f(inta)
{
auto int b,c=3;//b和c为整型的自动变量
……
}
auto是局部变量默认的存储类别,例
①auto int b,c=3;
②int b,c=3;//两种写法效果相同
自动变量在定义时自动分配存储空间,在作用域结束时自动释放空间。
用register声明寄存器变量
int fac (intn)
{
//下面声明i和f是寄存器变量
registerinti,f=1;
for(i=1;i<=n;i++)f=f*i;
returnf;
}
在程序中定义寄存器变量对编译系统只是
建议性(而不是强制性)的。
优化编译系统能够识别使用频繁的变量,
自动地将这些变量放在寄存器中。
用extern声明外部变量:一个文件内的全局变量
#include<stdio.h>
int max(int,int);
int main()
{
extern inta,b;//对全局变量a,b作提前引用声明
printf("%d\n",max(a,b));
return 0;
}
int a=15,b=-7;//定义全局变量a,b
int max(intx,inty)
{
int z;
z=x>y?x:y;
return z;
}
用static声明静态局部变量(staticlocalvariable)
int f(int a)
{
static intc=3;
……
}
性质:
局部特性:作用范围仅限于本函数
静态特性:存储在静态区,函数调用结束后不消失而保留原值,在下一次调用时,保留上一次调用结束时的值。
静态函数与外部函数
外部函数
max.c
extern int max(intx,inty)
{
intz;
z=x>y?x:y;
returnz;
}
外部函数
在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。如果在定义函数时省略extern,则默认
为外部函数。
main.c
#include<stdio.h>
extern int max(int,int);
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",max(a,b));
return0;
}
在需要调用此函数的文件中,用extern
声明所用的函数是外部函数。
模块化程序设计中的“单独编译”
多文件的项目中,每个文件可以单独编译,形成各自独立的目标文件(.o或.obj)。
在编译中,遇到调用外部函数,编译器会假定这个函数的定义存在,只不过不在当前
文件中,产生目标文件。所以,若语法正确,编译器不对此函数产生标识符未定义的
错误。
在连接时,检查编译器得到的若干目标文件中的函数,以及包括的库文件内提供的函
数,如果命名唯一,产生可执行的目标文件(.exe);否则,连接失败。
静态函数
max.c
static int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}
如果一个函数只能被本文件中其他函数所调用,它称为内部函数,又称静态(static)函数。如果在不同的文件中有同名的内部函数,互不干扰。
main.c
#include<stdio.h>
int max(int,int);
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",max(a,b));
return0;
}
通常把只允许在同一文件中使用的函数和全局变量前面都冠以static使之局部化,从而其他文件都不能引用
外部全局变量和静态全局变量
用extern拓展一个文件内的全局变量的作用范围
#include<stdio.h>
int max(int,int);
int main()
{
extern int a,b;//对全局变量a,b作提前引用声明
printf("%d\n",max(a,b));
return 0;
}
int a=15,b=-7;//定义全局变量a,b
int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}