函数_C语言快速入门与计算机二级备考

什么是函数

  • 函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值
  • 当代码中需要用到多处相同功能时,我们可以定义自己的函数并调用它,便于后期修改维护
  • C程序由函数构成,函数是C程序的基本组成单位;注意C语言只有函数,而没有子程序的概念

函数的使用

定义函数

  • 函数由函数头与函数体组成,例如:

    void sum(int begin,int end)//函数头:返回类型 函数名(参数表),不返回参数所以类型是void
    {
    	int i;
    	int sum =0;
    	for(i=begin;i<=end;i++)
    	{
    		sum+=i;
    	}
    	printf("%d",sum);
    //花括号内为函数体,即该函数所要执行的部分
    }
    
  • 所有函数都是平行的,一个函数不从属另一个函数,函数无法嵌套定义

函数头
  • 用于阐明:返回类型名,函数名,还有将被传递入函数内的参数

  • 在参数表内填void 表示明确地声明没有参数

    void f(); 这样的函数头则会让编译器猜测是否有参数,为了避免错误,在明确没有参数的函数中使用void f(void)

  • 括号内的逗号并不代表逗号运算符,只是标点符号

    但在写成 f((a,b))时,则会优先进行内部的逗号运算

函数原型
  • 自己定义的函数需要写在主函数上面

    因为编译器自上而下分析代码,在调用函数前需要先知道函数的样子

  • 函数原型声明:可以只把函数头复制到代码开头,告知编译器这个函数名及其返回与参数类型,这样的语句(因此末尾要有分号)就称为函数原型声明

使用函数

  • 调用函数

    函数名(参数列表)

    • ( )起到表示函数调用的重要作用,即使是无参函数也需要打上( )

    • 如果调用一个有参数的函数,则需要给出正确数量和顺序的参数,这些值会按顺序用以初始化函数中参数

    函数可以单调作为一个语句,要求其完成某些操作;也可出现在另一个表达式中,返回某个值参与运算

    • 函数不能嵌套定义,但可以嵌套调用,在调用一个函数过程中,可以又调用另一个函数
  • 递归调用

    函数还可以直接或间接地调用自己(递归要有结束的条件)

    例:使用递归计算阶乘

    int fac(int n);//n为被阶乘运算的数,f为运算结果
    {
    	int f;
    	if(n<0)
    		printf("error");
    	else if(n==0||n==1)
    		f=1;
    	else 
    		f=fac(n-1)*n;//重新调用自身(fac)
    	return(f);
    }
    int main()
    {
    	int n,f=0scanf("%d",&n);
    	f=fac(n);
    	printf("%d!=%d\n",n,f);
    	return 0;
    }
    

函数返回

  • return停止函数的执行,并送回一个值

    返回的值可以赋值给变量,可以再传递给函数

    写法有:return;(不返回值) 或者 return 表达式;(单一的变量也是表达式的一种)

    一个函数可以有多个return,并不一定放在最后(但这样不符合单一出口理念,不建议使用)

  • 例如:

    int max(float a,float b)//返回的类型是int
    {
    	float ret;
    	if (a>b)
    		ret=a;
    	else
    		ret=b;
    	return ret;//将变量ret的值返回,作为这个函数的结果
    }
    int main()
    {
    	float a,b;
    	int c;
    	c=max(a,b);//注意,若返回值数据类型与指定函数类型不同,将会进行强制类型转换
    }
    
  • 没有返回值的函数,使用void为函数头返回类型

    这时不能使用带值的return,也可以没有return

  • 数组类型和函数类型不能作为返回值,但是可以返回结构体,哪怕结构体中有数组

函数工作细节

参数传递

  • 定义时参数表中的参数形式参数,在调用函数时,实际参数的值将会被赋给形式参数

  • 如果函数有参数,调用函数时必须传递给它数量和类型正确的值

    C会帮你转换参数类型不匹配的情况,但这样可能导致不必要的错误

  • 传递给函数的值可以是表达式的结果,包括:

    • 字面量
    • 变量
    • 函数的返回值
    • 计算的结果
    • 数组名
  • C在调用函数时,只能传递值给函数,变量与参数并不会有联系

    每个函数有自己的变量空间,参数也位于这个独立空间中,与其它函数没有关系

    例如:

    //想设计一个交换a,b值的函数
    void swap(int a,int b);
    {
    	int t = a;
    	a=b;
    	b=t;
    }//调用时只是将下面a=5,b=6的值传递给函数
    //在swap函数内对a,b的任何操作对主函数内的a,b不造成影响
    int main()
    {
    	int a = 5;
    	int b = 6;
    	swap(a,b);
    	printf("a=%d b=%d",a,b);
    	return 0;
    }//因此这个函数无法完成预期工作
    

本地变量

  • 函数每次运行,会产生一个独立的变量空间,在这个空间内的变量,是函数这次运行所独有的,即本地变量

  • 定义在函数内部的变量就是本地变量(参数也是本地变量)

    本地变量不会被默认初始化,但参数在进入函数时就会被初始化

  • 生存期:在什么时候变量开始出现,到什么时候消亡

  • 作用域:在代码的什么范围内可以访问这个变量(这个变量起作用)

  • 对于本地变量,生存期与作用域都是大括号内(块内)

    本地变量可以定义在函数的块 或者 语句的块 甚至任意的大括号内

    而在块外定义的变量在块内依旧有效

    在块内可定义与块外同名的变量并盖住外面的变量

    一个块内则不能定义同名的变量

posted on   无术师  阅读(3)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了

统计

点击右上角即可分享
微信分享提示