C程序的基本单元是函数。函数中包含了程序的可执行代码。每个C程序的入口和出口都位于函数main()之中。main()函数可以调用其他函数,这些函数执行完毕后程序的控制又返回到main()函数中,main()函数不能被别的函数所调用。通常我们把这些被调用的函数称为下层(lower-level)函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待状态,直到被调用函数执行完毕。函数可以有参数和返回值。
创新互联专业为企业提供蔚县网站建设、蔚县做网站、蔚县网站设计、蔚县网站制作等企业网站建设、网页设计与制作、蔚县企业网站模板建站服务,十年蔚县做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
程序员一般把函数当作“黑箱”处理,并不关心它内部的实现细节。当然程序员也可以自己开发函数库。
说明一点,函数这一节很重要,可以说一个程序的优劣集中体现在函数上。如果函数使用的恰当,可以让程序看起来有条理,容易看懂。如果函数使用的乱七八糟,或者是没有使用函数,程序就会显得很乱,不仅让别人无法查看,就连自己也容易晕头转向。可以这样说,如果超过100行的程序中没有使用函数,那么这个程序一定很罗嗦(有些绝对,但也是事实)。
一、函数的定义
一个函数包括函数头和语句体两部分。
函数头由下列三不分组成:
函数返回值类型
函数名
参数表
一个完整的函数应该是这样的:
函数返回值类型 函数名(参数表)
{
语句体;
}
函数返回值类型可以是前面说到的某个数据类型、或者是某个数据类型的指针、指向结构的指针、指向数组的指针。指针概念到以后再介绍。
函数名在程序中必须是唯一的,它也遵循标识符命名规则。
参数表可以没有也可以有多个,在函数调用的时候,实际参数将被拷贝到这些变量中。语句体包括局部变量的声明和可执行代码。
我们在前面其实已经接触过函数了,如abs(),sqrt(),我们并不知道它的内部是什么,我们只要会使用它即可。
下面主要介绍无参数无返回值的函数调用。
二、函数的声明和调用
为了调用一个函数,必须事先声明该函数的返回值类型和参数类型,这和使用变量的道理是一样的(有一种可以例外,就是函数的定义在调用之前,下面再讲述)。
看一个简单的例子:
void a(); /*函数声明*/
main()
{
a(); /*函数调用*/
}
void a() /*函数定义*/
{
int num;
scanf(%d,num);
printf(%d\n,num);
}
在main()的前面声明了一个函数,函数类型是void型,函数名为a,无参数。然后在main()函数里面调用这个函数,该函数的作用很简单,就是输入一个整数然后再显示它。在调用函数之前声明了该函数其实它和下面这个程序的功能是一样的:
main()
{
int num;
scanf(%d,num);
printf(%d\n,num);
}
可以看出,实际上就是把a()函数里面的所有内容直接搬到main()函数里面(注意,这句话不是绝对的。)
我们前面已经说了,当定义在调用之前时,可以不声明函数。所以上面的程序和下面这个也是等价的:
void a()
{
int num;
scanf(%d,num);
printf(%d\n,num);
}
main()
{
a();
}
因为定义在调用之前,所以可以不声明函数,这是因为编译器在编译的时候,已经发现a是一个函数名,是无返回值类型无参数的函数了。
那么很多人也许就会想,那我们何必还要声明这一步呢?我们只要把所有的函数的定义都放在前面不就可以了吗?这种想法是不可取的,一个好的程序员总是在程序的开头声明所有用到的函数和变量,这是为了以后好检查。
前面说了,在调用之前,必须先声明函数,所以下面的做法也是正确的(但在这里我个人并不提倡)。
main()
{
void a();
a();
}
void a()
{
int num;
scanf(%d,num);
printf(%d\n,num);
}
一般来说,比较好的程序书写顺序是,先声明函数,然后写主函数,然后再写那些自定义的函数。
既然main()函数可以调用别的函数,那么我们自己定义的函数能不能再调用其他函数呢?答案是可以的。看下面的例子:
void a();
void b();
main()
{
a();
}
void a()
{
b();
}
void b()
{
int num;
scanf(%d,num);
printf(%d\n,num);
}
main()函数先调用a()函数,而a()函数又调用b()函数。在C语言里,对调用函数的层数没有严格的限制,我们可以往下调用100层、1000层,但是在这里我们并不提倡调用的层数太多(除非是递归),因为层数太多,对以后的检查有一些干扰,函数调过来调过去,容易让自己都晕头转向。
某些人可能就不明白了,看上面的例子,好象使用函数后,程序变的更长了,更不让人理解。当然,我举的这个例子的确没有必要用函数来实现,但是对于某些实际问题,如果不使用函数,会让程序变的很乱,这涉及到参数问题。
如果在设计c语言程序中,反复要用到一个组合计算的程序段,比如:
void main()
{
int a,b,c,x,y,z,j,k,l;
...
c=a+b; c-=(a-b)/2; //计算c=(a+b)-(a-b)/2
...
z=x+y; z-=(x-y)/2; //计算z=(x+y)-(x-y)/2
...
l=j+k; l-=(j-k)/2; //计算l=(j+k)-(j-k)/2
...
}
由于它们的计算公式相同,就采用一个函数来替代相似的语句:
int fun(int a,int b) { int c; c=a+b; c-=(a-b)/2; return c; } //按照公式计算并返回结果
这样程序就变成了:
int fun(int a,int b) { int c; c=a+b; c-=(a-b)/2; return c; }
void main()
{
int a,b,c,x,y,z,j,k,l;
...
c=fun(a,b);
...
z=fun(x,y);
...
l=fun(j,k);
...
}
*这样的效果是:重复利用了函数的代码,节省程序的代码量(尤其是计算公式很复杂的情况更突出),程序简洁易读,便于统一修改计算公式和方法。
*还有一个优点就是:你调用函数时,无须知道算法的细节,按照函数调用规则就可以使用了,比如,标准c提供的函数double sin(double x),你只要知道这是个计算正弦函数值的函数即可,拿来可用而不必去看具体标准函数库是怎样计算的。
*你的函数如果写得正确、经典的话,完全可以封装成标准函数拿给其他人使用,甚至可以不提供源代码就可以。
*没有返回值的函数又可以叫子程序
请问C语言函数的调用规则是什么,例如主函数main、 函数A 、函数B,这3者的顺序能否打乱,
可以打乱,依个人习惯。
如果 A函数放最前,能否直接调用B函数?还是只能后面的函数调用前面的函数,还是说只要在A函数中声明B函数就能够调用后面的B函数。?
A调B,或B调A都可以,如果B在A后,B可直接调用A,否则,先在B前声明一下A再调用A。
main函数的有没有固定的位置,例如要放最前面?或最后面?
没有要求,一般单独一个C文件放main函数。
我需要程序调用这一部分的 语法描述图,因为规则不是固定,所以画起来有点难度,有没人能提供 程序调用的语法描述图 就是类似 void ---- ident----(----)----{----语句…… 这样的图。加分加分!!
不明白,写两个简单函数实验一下就知道了,这样印象会深刻点不容易忘。