函数_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=0; scanf("%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; }//因此这个函数无法完成预期工作
本地变量
-
函数每次运行,会产生一个独立的变量空间,在这个空间内的变量,是函数这次运行所独有的,即本地变量
-
定义在函数内部的变量就是本地变量(参数也是本地变量)
本地变量不会被默认初始化,但参数在进入函数时就会被初始化
-
生存期:在什么时候变量开始出现,到什么时候消亡
-
作用域:在代码的什么范围内可以访问这个变量(这个变量起作用)
-
对于本地变量,生存期与作用域都是大括号内(块内)
本地变量可以定义在函数的块 或者 语句的块 甚至任意的大括号内
而在块外定义的变量在块内依旧有效
在块内可定义与块外同名的变量并盖住外面的变量
一个块内则不能定义同名的变量
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/untit1ed/p/18547820
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
请注意: 特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了