函数
首先,函数的定义是完成特定任务的独立程序代码单元。
从定义中可以看出,函数能完成特定任务并且是一个独立单元。
先看这个函数
从上面看,有两个函数:f和g,这两个函数在一些细节有些不同,但都得包括函数的基本结构,函数的定义和函数体
函数的定义是位于一个函数的第一行 通常由一个类型开头代表函数的返回值类型,后接一串英文代表函数名,这是区分函数的第一个部分,函数名后跟一对圆括号,里面写函数的形参,同样函数的形参也有类型和名字,最后圆括号外边不能写分号函数定义下面就是以一对花括号括起来的函数体,在函数体中可以进行各种你想进行的操作,赋值判断循环调用其他函数甚至调用自己;当然通常是实现一个功能。这样函数格式就好了。
函数分为有参函数和无参函数,有参数就是上面的圆括号里面有形参,无参就是圆括号里面可以写void代表空,也可以什么都不写;函数又分为有返回值的函数和无返回值的函数,有返回值的函数中一定要有return(return下面详解)return后面跟一个变量或者常数或者一个表达式,必须满足变量或者常数或者表达式与函数定义时的返回值一致,无返回值在函数定义时函数名前写void 同时函数中可以不出现return。
有无参数和返回值视函数功能而定,如果函数只是想输出一些东西,就可以不要返回值,如果想用来执行一些计算,就需要把计算结果返回
return:
return 是函数结束的标志,函数返回值只有一个,但是函数中return语句可以出现多次,函数在执行时只要见到第一个return就会结束函数的执行,并将值返回,return可以出现在任何位置,普通语句或者if语句下或者循环语句里面,程序只要执行到第一个return函数就会结束,请看下面程序:
int f(void) { return 1; return 2; return 3; }
这个函数如果调用(调用函数下面详解^_^)那么这个函数的值就是1,下面的2和3不用执行,执行到1就会结束;
int gcd(int n)//求n是否为素数,是就返回1,不是返回0 { int i; if( n == 0 || n == 1 )//0和1都不是素数,如果传入0和1 就直接返回0 { return 0; } for( i = 2; i < n; i++ )//i从2开始增到n-1,其实只用到根号n就可以 if( n%i == 0 )//每次循环判断一下n能否整除i,如果出现一个能整除,直接返回0 return 0; return 1;//既不是1和0,又从2到n-1都不能整除,所以n是素数 }
这是判断素数的经典算法;其中就有三处return,只能返回一处的值,根据具体条件来,一般在一个函数中出现了多条return语句,这些除了最后一个都是在if语句下的,满足某些条件就返回值并结束函数。
到这里大概就知道如何定义函数了,定义完就该使用了。对于函数来说叫调用。
大家都知道,程序永远都是从main函数开始到main函数结束,main函数叫主函数,所以其他函数必须直接或者间接的受到main函数的调用,才能运行,如何调用呢,请看下面代码
1 #include<stdio.h> 2 void g(void) 3 { 4 printf("调用了g函数\n"); 5 } 6 void f() 7 { 8 printf("调用了f函数\n"); 9 } 10 int main(void) 11 { 12 g();//调用g函数 13 f();//调用f函数 14 g();//再次调用g函数 15 return 0; 16 }
运行结果函数从main函数开始运行到第12行看到了g然后他就会从这个12开始往上找这个g是什么东西,记住是往上找,所以f和g得写在main函数上面不写在上面也可以但是g这个语句上面必须有g函数的声明,声明就是和定义函数的第一句话一样不过后面得加分好,声明就是告诉编译器,这个g是个什么东西,同样下面的f也是,请看下面的有声明的代码,和上面的代码效果是一样的
#include<stdio.h> void g(void);//函数g的声明 void f();//函数f的声明 int main(void) { g();//调用g函数 f();//调用f函数 g();//再次调用g函数 return 0; } void g(void) { printf("调用了g函数\n"); } void f() { printf("调用了f函数\n"); }
我建议写声明 因为可能这个函数要调用其他函数,没有声明的话,这个被掉函数必须写在主调函数上面,程序小的时候还好,程序大了一点后在写的时候就会非常难受,这是我以前写的一个不算很大的程序的函数声明:
所以要养成习惯,多写点东西没事,养成良好习惯才最好
这是函数调用流程的图,可以仔细想想;
在函数调用时候,有参数的函数调用时在函数名后面的括号里面必须写上对应的实参,然后实参的值会传给形参,实参和形参必须对应的数量和类型都得相同,被掉函数如果有返回值,主调函数可以接受也可以不接受,如果接受,必须接受的变量与返回值的类型一直,当然函数也可以出现在判断语句中,利用函数的返回值来进行判断也是经常使用的手段
在函数传参这块的学问还有很多,比如,传数组和指针,在这里提一下,数组的作为参数会退化成指针,这会在我另一篇文章指针和数组中说到,函数的使用先到这里,以后再做补充
原创,转载标明出处,谢谢!