ios学习之旅---c语言函数
1、函数的概述
C源程序是由函数组成的。
尽管在前面各章的程序中大都仅仅有一个主函数main(),但有用程序往往由多个
函数组成。
函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。
C语言不仅ᨀ供了极为丰富的库函数(如Turbo C,MS C都ᨀ供了三百多个库函数)。还同意用户建立自己
定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。
能够说C
程序的所有工作都是由各式各样的函数完毕的,所以也把C语言称为函数式语言。
2、函数的分类
在C语言中可从不同的角度对函数分类。
1) 从函数定义的角度看,函数可分为库函数和用户定义函数两种。
库函数:由C系统ᨀ供,用户无须定义,也不必在程序中作类型说明,仅仅需在程序前包括有该函数原型的
头文件就可以在程序中直接调用。在前面各章的例题中重复用到printf、scanf、getchar、putchar、gets、puts、strcat等函数均属此类。
用户定义函数:由用户按须要写的函数。对于用户自己定义函数。不仅要在程序中定义函数本身,并且在主调函数模块中还必须对该被调函数进行类型说明,然后才干使用。
2) 语言的函数兼有其他语言中的函数和过程两种功能。从这个角度看,又可把函数分为有返回值函数和无
返回值函数两种。
有返回值函数:此类函数被调用运行完后将向调用者返回一个运行结果,称为函数返回值。
如数学函数即属于此类函数。
由用户定义的这样的要返回函数值的函数。必须在函数定义和函数说明中明白返回值的类型。
无返回值函数:此类函数用于完毕某项特定的处理任务,运行完毕后不向调用者返回函数值。这类函数类似于其他语言的过程。
因为函数无须返回值。用户在定义此类函数时可指定它的返回为“空类型”。空类型的说明符为“void”。
3) 从主调函数和被调函数之间数据传送的角度看又可分为无參函数和有參函数两种。
无參函数:函数定义、函数说明及函数调用中均不带參数。
主调函数和被调函数之间不进行參数传送。此类函数通经常使用来完毕一组指定的功能,能够返回或不返回函数值。
有參函数:也称为带參函数。
在函数定义及函数说明时都有參数,称为形式參数(简称为形參)。在函数调用时也必须给出參数。称为实际參数(简称为实參)。进行函数调用时,主调函数将把实參的值传送给形參。供被调函数使用。
4) C语言ᨀ供了极为丰富的库函数,这些库函数又可从功能角度作下面分类
字符类型分类函数、转换函数、文件夹路径函数、诊断函数、图形函数、输入输出函数、接口函数、字符串函数、内存管理函数数学函数、日期和时间函数、进程控制函数、其他函数。
3、函数的定义
①无參无返回值
一般形式例如以下:
void 函数名(){
声明部分 //定义局部变量
语句
}
Void 无返回值函数:此类函数用于完毕某项特定的处理任务。运行完后不向调用者返回运行结果。这类函数类似于其它语言的过程。因为函数无返回值。用户在定义此类函数时可指定其函数返回值为“空类型”
②有參无返回值
一般形式例如以下:
void 函数名(形式參数表列){
声明部分
语句
}
形式參数表列表的格式:类型 变量名,类型 变量2,…….
③无參有返回值函数定义
一般形式例如以下:
返回值类型 函数名(){
声明部分
语句
return 返回值类型变量或常量; //返回给主调函数
}
④有參有返回值函数定义
一般形式例如以下:
返回值类型 函数名(形式參数表列){
声明部分
语句
return 返回值类型变量或常量;
}
注意:定义函数时注意函数名不能反复
4、函数參数
①、形式參数
定义函数的时候,函数名后面小括号里的參数,简称形參形式參数是什么样类型的数据,那么实际參数也必须是什么样的类型函数内部不能够定义与函数形參同名的变量。由于形參与函数的代码是一个代码块
②、实际參数
调用函数的时候,函数名后面小括号里的參数,简称实參实參出如今主调函数中,进入被调函数后。实參变量也不能使用。
形參和实參的功能是作数值的传递。
发生函数调用时,主调函数把实參的值传送给被调函数的形參从而实现主调函数向被调函数的数据传送。
③函数形參和实參的传值过程
1)形參变量仅仅有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。
因此。形參仅仅有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形參变量。
2)实參能够是常量、变量、表达式、函数等,不管实參是何种类型的量,在进行函数调用时,它们都必须具有确定的值。以便把这些值传送给形參。因此应预先用赋值。输入等办法使实參获得确定值。
3)实參和形參在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
5、函数的返回值
①、函数的返回值
函数的值(或称函数返回值)是指函数被调用之后,运行函数体中的程序段所取得的返回给主调函数的值。
②使用注意
1) 函数的值仅仅能通过return语句返回主调函数。
return语句的一般形式为:return 表达式;
或者为:return (表达式);
该语句的功能是计算表达式的值,并返回给主调函数。
在函数中同意有多个return语句。但每次调用仅仅能有一个return 语句被运行,因此仅仅能返回一个函数值。
2) 函数返回值的类型和函数定义中函数的类型应保持一致。假设两者不一致。则以函数类型为准,自己主动进行类型转换。
3) 如函数值为整型。在函数定义时能够省去类型说明。
也就是说假设没有指定返回类型,那么C语言默认是int的类型(开发中不要省略返回值类型)
4) 不返回函数值的函数,能够明白定义为“空类型”,类型说明符为“void”。为了使程序有良好的可读性并降低出错, 凡不要求返回值的函数都应定义为空类型。
6、函数的调用
①、函数的声明
在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。
在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作对应的处理。其一般形式为:
返回值类型 被调函数名( 类型 形參, 类型 形參… );
或为:
返回值类型 被调函数名( 类型, 类型…);
如:
int max( int a, int b );
int max( int, int );
注意:
1) 假设被调函数的返回值是整型或字符型时。能够不正确被调函数作说明,而直接调用。这时系统将自己主动对被调函数返回值按整型处理。
如:
Int main()
{
Intz=0;
Z=max(33,44);
printf(“%d\n”,z);
printf(“%d\n”,max(11,82));
return0;
}
Int max(int num1,int num2){
Returnnum1>num2?num1:num2;
}
2) 当被调函数的函数定义出如今主调函数之前时,在主调函数中也能够不正确被调函数再作说明而直接调用。
如:
Int max(int num1,int num2){
Returnnum1>num2?
num1:num2;
}
Int main()
{
Intz=0;
printf(“%d\n”,z);
printf(“%d\n”,max(11,82));
return0;
}
②、函数的调用
1) 函数表达式
函数作为表达式中的一项出如今表达式中。以函数返回值參与表达式的运算这样的方式要求函数是有返回值的。
int z=0;
z = max(23,80)+1;
2) 函数语句
函数调用的一般形式加上分号即构成函数语句。
printf("%d",a);
scanf("%d",&b);
3) 函数实參
函数作为还有一个函数调用的实际參数出现。
这样的情况是把该函数的返回值作为实參进行传送,因此要求该函数必须是有返回值的。
printf("%d\n",max(20, 30));
③、函数的嵌套调用
C语言中不同意作嵌套的函数定义。
因此各函数之间是平行的。不存在上一级函数和下一级函数的问题。可是C语言同意在一个函数的定义中出现对还有一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其他函数。这与其他语言的子程序嵌套的情形是类似的。
7、递归函数
①递归函数概述及使用方法
一个函数在它的函数体内调用它自身称为递归调用。这样的函数称为递归函数。C语言同意函数的递归调用。在递归调用中。主调函数又是被调函数。运行递归函数将重复调用其自身,每调用一次就进入新的一层
如:
Int f(intx){
Int y;
Z=f(y);
Return z;
}
这个函数是一个递归函数。可是执行该函数将无休止地调用其自身。这当然不对的。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。
用的办法是加条件推断。满足某种条件后就不再作递归调用,然后逐层返回。
②、递归函数应用举例
有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。
问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人。说比第1个人大两岁。最后问第1个人,他说是10岁。
请问第5个人多大?
分析:
每个人的年龄都比其前1个人的年龄大两岁。即:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10
能够用式子表述例如以下:
假设(n=1)
age(1)=10
假设(n>1)
age(n)=age(n-1)+2
int getAge(int n){
intage ;
if(n==1){
age =10;
}else{
age =age(n-1)+2;
}
returnage;
}
/**
* 计算n的阶乘
* @return 返回阶乘的值
*/
int jieCheng(int n){
int jc; //定义变量用于存放阶乘的结果
if (n==1) { //假设n=1的时候。1。的结果还是1
jc = 1;
}else{
jc = jieCheng(n-1)*n;//假设不是1,阶乘=(n-1)!*n;
}
return jc;
}
int main(){
int a =jieCheng(8);
printf("%d\n",a);
return 0;
}
ios学习之旅---c语言函数的更多相关文章
- 学习LoadRunner之C语言函数
学习LoadRunner之C语言函数 Action() { /*strchr和strrchr的区别*/ /* char *strTest1="citms citms"; char ...
- iOS学习08之C语言内存管理
本次主要学习和理解C语言中的内存管理 1.存储区划分 按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区 1> 栈区:局部变量的存储区域 局部变量基本都在函数.循环.分支中定义 栈区的内 ...
- iOS学习07之C语言指针
本次随笔主要是为了学习和理解C语言中的指针,指针树状图如下: 1.访问数据的两种方式 1> 直接访问:定义变量后,直接访问变量 ; printf("a = %d\n", a) ...
- 【C语言学习笔记】C语言函数执行成功时,返回1和返回0,究竟哪个好?
基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...
- 学习笔记之——C语言 函数
采用函数的原因: 随着程序规模的变大,产生了以下问题: --main函数变得相当冗杂 --程序复杂度不断提高 --代码前后关联度提高,修改代码往往牵一发而动全身 --变量使用过多,命名都成了问题 -- ...
- ios学习之旅--oc对象的关系
1.匿名对象:就是没有名字对象 1.匿名对象仅用一次 使用场景: 1.当我们仅仅要调用一个对象的某个方法一次的时候能够使用匿名对象 2.匿名对象能够作为函数的实际參数 #imp ...
- IOS学习之路-- 指针&宏函数
如果*p被()包住,说明指针变量p将来指向的是函数 //声明一个指针变量 //int (*p)(int, int) = sum; int (*p)(int, int); p = sum; // 如果* ...
- 【IOS学习】【Swift语言】
基本语法: OS X playground 引入 import Cocoa IOS playground 引入 import UIKit 基本数据类型 let 定义常量 定义完成之后无法修改 var ...
- 我的Java开发学习之旅------>Java语言中方法的参数传递机制
实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...
随机推荐
- 洛谷 P1156 垃圾陷阱 (01背包拓展)(好题!!)
这真是一道好题目 学到了很多 一开始感觉吃或者不吃会有后效性 然后看到洛谷的题解,直接把这个有后效性的部分当作dp的维度和值 因为这个垃圾可以堆或者不堆,所以这个很像01背包, 但是加了非常多的限制条 ...
- Unity 编辑器学习(三)之 Light & Baked
上一篇博客已经详细的介绍GI了,接下来我们讲点实际的,怎么烘焙场景及注意事项. 一.Light Property: Function: Type 当前灯光的类型.有四种类型:Directional, ...
- main()函数的形参
main函数中的第一个参数argc代表的是向main函数传递的参数个数,第二个参数argv数组代表执行的程序名称和执行程序时输入的参数 #include <stdio.h> int mai ...
- HTML学习----------DAY2第四节
HTML 文档是由 HTML 元素定义的. HTML 元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签(opening ...
- POJ 1887 Testingthe CATCHER (LIS:最长下降子序列)
POJ 1887Testingthe CATCHER (LIS:最长下降子序列) http://poj.org/problem?id=3903 题意: 给你一个长度为n (n<=200000) ...
- Hadoop2.2集群安装配置-Spark集群安装部署
配置安装Hadoop2.2.0 部署spark 1.0的流程 一.环境描写叙述 本实验在一台Windows7-64下安装Vmware.在Vmware里安装两虚拟机分别例如以下 主机名spark1(19 ...
- nginx 11个过程
nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系,详细内容可以阅读<深入理解nginx:模块开发与架构解析>这本书,这里只做简单介绍: 1. ...
- 如何更改jar包源码
首先将你要更改的源码文件在eclipse中编译成.class文件 再找到你需要更改的.jar包 在桌面右键新建个文件夹把你要改的.jar包ctrl+c和ctrl+v 准备好一个压缩工具(这里推荐234 ...
- Linux常用视频播放器
1.SMplayer是一款跨平台的视频播放工具,可以支持大部分的视频和音频文件.它支持音频轨道切换.允许调节亮度.对比度.色调.饱和度.伽玛值,按照倍速.4倍速等多种速度回放.还可以进行音频和字幕延迟 ...
- openSUSE leap 42.3 添加HP Laserjet Pro M128fn打印机和驱动
一.安装驱动 YaST控制中心->软件管理->搜索->hplip 安装hplip 如下图: HPLIP(Linux Imaging and Printing Object)以前有hp ...