栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言之函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言之函数

函数
  • 函数的定义
  • 函数的调用
    • 函数参数
    • 函数的类型
    • 函数的返回值
    • 嵌套调用
    • 递归调用
  • 数组作函数参数
  • 局部变量和全局变量及其作用域
  • 动态变量与静态变量

函数的定义

函数定义的一般形式函数类型 函数名(类型名 形式参数1,……) { 说明语句 执行语句 }
没有形式参数的函数称为无参函数
例如:求两个数的最大值。

int max(int x,int y)
{
    int z;
    z=x>y?x:y;
    return (z);
}

无参函数也可以这样定义:

int max(x,y)
int x,y;
{
    int z;
    z=x>y?x:y;
    return (z);
}

如下这样定义是错误的

int max(x,y)
{
    int x,y;
    ……
    //或
    int max(int x,y)
{……}
   //或
int max(x,y)
int x,y,z;
{
    z=x>y?x:y;
    return (z);
}
函数的调用
  1. 函数调用的一般形式:
函数名(实参表列)
  1. 函数调用的方式
  • 函数语句如:printstar();
  • 函数表达式如:c=max(c,max(a,b));
  • 函数参数如:m=max(c,max(a,b));
  1. 在调用函数时,应对被调用函数作说明,其格式一般如下:
    函数类型 函数名(类型 形参,类型 形参);
    C语言同时又规定,在以下2种情况下,可以省去对被调函数的说明:
    (1)函数的值是整型或字符型。
    (2)当被调用函数的函数定义出现在调用函数之前时。
函数参数

① 当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。
② 实参可以是常量、变量或表达式,但要求它们有确定的值。
③ 实参与形参类型要一致;个数要相等
④ 在函数调用时,实参的值赋给与之相对应的形参。“单向值传递”。

例题1
编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值

void swap(int x,int y)
{
    int z;
    z=x;x=y;y=z;
    printf("nx=%d,y=%d",x,y);
}
main()
{
    int a=10,b=20;
    swap(a,b);
    printf("na=%d,b=%dn"a,b);
}

程序输出结果:
x=20,y=10
a=10,b=10

函数的类型

例题2:输出两个数中的大数

int max(int x,int y)
{
    int z;
    z=x>y?x;y;
    return(z);//返回z的值
}
main()
{
    int a,b,c;
    scanf("%d,%d",&a,&b);
    c=max(a,b);
    printf("max is %dn",c);
}

说明:
①函数的类型决定了函数返回值的类型。若省略函数的类型,系统默认其为int型。
②无返回值的函数应将其类型定义为void (空)类型。

函数的返回值

函数的返回值是通过return语句带回到主调函数的

  • return语句格式:
    return(表达式);或return表达式;
    功能:终止函数的运行,返回主调函数。若有返回值,将返回值带回主调函数。
    说明:① 若函数没有返回值,return语句可以省略。② return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换为函数类型。
main()
{
    float a,b;
    int c;
    scanf("%f,%f",&a,&b);
    c=max(a,b);
    printf("max is %d",c);
}
int max(float x,float y)
{
    float z;
    z=x>y?x:y;
    return(z);
}

输入:2.5,3.8
运行结果:max is 3
例题3:求表达式的值:s=1234…*n

main()
{
    int m;
    long t,jc(int n);
    printf("please input m:");
    scanf("%D",&m);
    t=jc(m);
    printf("s=%ld",t);
}
long jc(n)
int n;
{
    int i;
    long s=1;
    for (i=1;i<=n;i++)
    s=s*i;
    return(s);
}
嵌套调用

main函数调用函数A
函数A调用函数B
例题4:计算s=22!+32!

long f1(int p)
{
    int k;
    long r;
    long f2(int);
    k=p*p;
    r=f2(k);
    return r;
}
long f2(int q)
{
    long c=1;
    int i;
    for(i=1;i<=q;i++)
      c+c*i;
    return c;
}
main()
{
    int i;
    long s=0;
    for(i=2;i<=3;i++)
      s=s+f1(i);
    printf("ns=%ldn",s);
}
递归调用

一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。
例题5:编一递归函数求n!
思路:n!=n*(n-1)! ,(n-1)!=(n-1)*(n-2)!
递归结束条件:当n=1,0时,n!=1

float fact(int n)
{
    float f;
    if(n<0)
    {
      printf("n<0,error!");
      f=0;}
    else if(n==0||n==1)
      f=1;
    else f=fact(n-1)*n;
    return(f);
}
main()
{
    int n;float y;
    printf("nInput n:");
    scanf("%d",&n);
    y=fact(n);
    printf("%d!=%fn"n,y);
}

运行情况如下:
Input :4
4!=24

数组作函数参数
  • 数组元素作函数实参——值传递
  • 数组名做函数参数——地址传递
    在主调函数与被调函数分别定义数组,且类型应一致,形参数组大小可不指定。
void swap(int x[2])
{
    int z;
    z=x[0];x[0]=x[1];z[1]=z;
}
main()
{
    int a[2]={1,2};
    swap(a);
    printf("a[0]=%dna[1]=%dn",a[0],a[1]);
}

例题6:求10个学生的平均成绩

float average(float a[],int n)
{
    int i;
    float aver,sum=a[0];
    for(i=1;i 

运行了这串代码好像不行,没找出错误。。。。希望看到的大佬帮忙找找

局部变量和全局变量及其作用域

变量的作用域:变量在程序中可以被使用的范围。
根据变量的作用域可以将变量分为局部变量和全局变量。

  1. 局部变量——内部变量
  • 定义:在函数内定义,只在本函数内有效
  • 说明:main函数中定义的变量旨在main中有效;形参属于局部变量;不同函数中同名变量,占不同内存单元;可在复合语句中定义有效变量。
  1. 全局变量——外部变量:
  • 在函数外部定义的变量。
  • 作用域:从定义变量的位置开始到本源文件结束。
动态变量与静态变量
  • 函数中的局部变量,如不作专门说明,都属于动态变量
main()
{
int x,y;
...
}
//等价于
main()
{
auto int x,y;
...
}
  • 如果要定义静态变量,在变量定义前面加“static”
main()
{
static int x,y;
...
}

动态变量与静态变量的区别

  1. 内存分配
  • 动态变量:调用函数时在动态存储区为其分配存储单元,函数执行结束,所占内存空间即刻释放。
  • 静态变量:将其分配在内存的静态存储区中,程序运行结束释放该单元。
  1. 变量的初值
  • 动态变量:如果赋初值则每次函数被调用时执行一次赋值操作。
  • 静态变量:若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值。

注意:动态变量定义变量时若没有赋初值,变量的初值不确定;静态变量若定义时未赋初值,在编译时,系统自动赋初值为0.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号