前言
c语言的函数类似java的方法。作用是把较大的任务分解成若干个较小,较简单的任务,并提炼出公共任务的方法。称为分而治之
一、函数的定义
函数的分类
标准库函数:标准库函数如我们熟知的printf(),scanf()等,只需要在程序开头把函数所在的头文件包含进来即可。
自定义函数:自行编写函数来解决问题。开发环境内部可以采取“拿来吧你”,使得别人可以用自己的函数
函数的定义
函数名: 函数的唯一标识用来说明函数的功能。
函数体: 函数体用一堆花括号包围,这里的花括号{}是函数体的定界符。函数体内部的定义变量只能在函数体内访问,称为内部变量
形式参数:函数头部参数表里的变量称,简称为形参
若函数没有函数返回值,则需用void定义返回值得类型,
二、向函数传递值和从函数返回值
函数调用
假设有一个函数Fact(),我们用main来调用,则需要提供一个实际参数。(简称实参)的表达式给被调用的函数。那么吧实参的值赋值给形参的过程称为参数传递
#include<stdio.h>
long Fact(int n){
int i;
long result=1;
for(i=2;i<=n;i++){
result=result*i;
}
return result;
}//实际上就是把result传给了ret
int main(void)
{
int m;
long ret;
printf("input m:");
scanf("%d",&m);
ret=Fact(m);
printf("%d!=%ld",m,ret);
return 0;
}
上述Fact(int n)实际上是我们实现定义好的函数,n实际上就是所谓的形参,上述的Fact(m)中的m实际上就是实参。就是实际上要用的参数。
==函数的返回值只有一个,函数的返回值只有一个,函数返回值类型除了数组都可以
函数的写法
上述函数如果把上面一部分拿下去:
#include<stdio.h>
int main(void)
{
int m;
long ret;
printf("input m:");
scanf("%d",&m);
ret=Fact(m);
printf("%d!=%ld",m,ret);
return 0;
}
long Fact(int n){
int i;
long result=1;
for(i=2;i<=n;i++){
result=result*i;
}
return result;
}//实际上就是把result传给了ret
结果为:
合并后的另一种写法
上述代码只能把先写分块函数再写主函数。
而另一种写法需要函数原型声明
上述程序改动如下
#include<stdio.h>
long Fact(int n);//函数原型声明
int main(void)
{
int m;
long ret;
printf("input m:");
scanf("%d",&m);
ret=Fact(m);
printf("%d!=%ld",m,ret);
return 0;
}
long Fact(int n){
int i;
long result=1;
for(i=2;i<=n;i++){
result=result*i;
}
return result;
}//实际上就是把result传给了ret
即可正常编译
函数的递归调用和递归函数
递归:一个对象部分地由它自己组成或按它自己定义。
下面用递归算法计算整数n的阶乘n!
#include<stdio.h>
long Fact(int n);
int main(void)
{
int n;
long result;
printf("Input n:");
scanf("%d",&n);
result=Fact(n);
if(result==-1)
printf("n<0,data error!\n");
else
printf("%d!=%d\n",n,result);
return 0;
}
//函数功能:用递归算法计算n!,当n>=0时返回n!,否则返回-1
long Fact(int n)
{
if(n<0)
return -1;
else if(n==0||n==1)
return 1;
else
return(n*Fact(n-1));
}
一般情况:由自身定义的与原始问题类似的更小规模的子问题
极限情况:能够用来结束递归调用过程的条件
递归函数:==在函数内直接或间接地自己调用自己
变量的作用域和生存期
语句块:程序块中被花括号括起来的区域,变量的作用域规则是每个变量仅在定义它的语句块内有效,并且拥有自己的存储空间
全局变量:不再语句块内定义的变量
局部变量:在除整个程序以外的其他语句块内定义的变量,在全局变量中已经定义好了,就不需要在作用域中定义了
三,与java方法的对比
java的方法在java的main中即可定义,且java的方法引用只需要使用点运算符。
相对于c来说相对简洁。但是c语言更加底层,逻辑也会更加清晰。且分块处理也可以更好的去分配项目。
关于c和java的面向过程与面向对象将在之后的博客中陆续更新