黑马程序员——C语言——函数
2015-11-24 20:06
309 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------
一、函数的概念
完成特定功能的代码段,它也是组成我们C语言源程序的基本单位
函数的优点:1)提高程序的可读性;2)可以提高开发效率;3)提高代码的重用性。
二、函数的定义:
格式:
1) 从函数定义的角度看,函数可分为库函数和用户定义函数两种。
2) 语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。
3) 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。
四、函数的使用
函数定义到使用分三步:1、声明。2、定义函数。3、调用函数。
函数的声明:
在调用函数中调用某函数之前,应对该被调用的函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的. 在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。其一般形式为:
返回值类型 被调函数名( 类型 形参, 类型 形参... );
注意:
1) 如果被调函数的返回值是整型时,可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。
2) 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函 数再作说明而直接调用。
C语言中,函数调用的一般形式为:
函数名(实际参数表);
1、形式参数 定义函数的时候,函数名后面小括号中的参数,简称形参
2、实际参数 调用函数的时候,函数名后面小括号中的参数,简称实参
函数的参数传递过程
1)形参变量只有在被调用时才分配内存单元在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数 调用结束返回主调函数后则不能再使用该形参变量。
2)实参可以是常量、变量、表达式、函数等 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
六、函数的返回值
函数的值(或称函数返回值)是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
使用注意事项
1) 函数的值只能通过return语句返回主调函数。
2) 函数返回值的类型和return实际返回的值类型应保持一致。如果两者不一致,则以return 实际类型为准,自动进行类型转,最后转换成返回值类型返回.
3) 如函数值为整型,在函数定义时可以省去类型说明。 也就是说如果没有指定返回类型, 那么C语言默认是int的类型(开发中不要省略返回值类型)
4) 不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。 为了使程序 有良好的可读性并减少出错, 凡不要求返回值的函数都应定义为空类型。
七、函数的嵌套使用
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。
八、递归函数
一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。
递归函数构成条件:
1)自己调用自己 2)存在一个条件能够让递归结束3)问题的规模能够缩小
递归函数的执行有两个阶段:
1)递推阶段:问题规模缩小的过程 2)回归迭代:迭代计算值得过程
递归的优点和缺点:
优点是:遇到问题规模能够缩小,而且有规律的问题的时候,代码比较简洁
缺点:消耗内存,建议在程序中不能用太多
递归举例:求N的阶乘
-------
一、函数的概念
完成特定功能的代码段,它也是组成我们C语言源程序的基本单位
函数的优点:1)提高程序的可读性;2)可以提高开发效率;3)提高代码的重用性。
二、函数的定义:
格式:
返回值 函数名(形参列表){ 函数体; //return }三、函数的分类
1) 从函数定义的角度看,函数可分为库函数和用户定义函数两种。
2) 语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。
3) 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。
四、函数的使用
函数定义到使用分三步:1、声明。2、定义函数。3、调用函数。
函数的声明:
在调用函数中调用某函数之前,应对该被调用的函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的. 在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。其一般形式为:
返回值类型 被调函数名( 类型 形参, 类型 形参... );
注意:
1) 如果被调函数的返回值是整型时,可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。
2) 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函 数再作说明而直接调用。
/* 函数要 先声明 再调用 void sum(); 将被调函数的头部复制一份加一个分号 注意事项: 如果被调函数声明的返回值为int 可以省略声明 */ #include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... printf("Hello, World!\n"); void sum1(); sum(); return 0; } int sum(){ return 0; } void sum1(){ }函数的定义和调用
C语言中,函数调用的一般形式为:
函数名(实际参数表);
#include <stdio.h> //无参数无返回值 void print_line(){ printf("__________________\n"); } //有参数无返回值 void print_line_n(int n){ for (int i = 0; i < n; i++) { printf("________\n"); } } //无参数有返回值 int sum1(){ return 0; } //有参数有返回值 int sum(int x,int y){ int z = x + y; return z; } int num_num(int a){ return a*a; } int main(int argc, const char * argv[]) { print_line(); print_line_n(5); int s = sum(4, 5); printf("s = %d\n",s); printf("sum1 = %d\n",sum1()); printf("请输入一个数,求它的平方!\n"); int a; scanf("%d",&a); int a2 = num_num(a); printf("a的平方 = %d\n",a2); return 0; }五、函数的形参和实参
1、形式参数 定义函数的时候,函数名后面小括号中的参数,简称形参
2、实际参数 调用函数的时候,函数名后面小括号中的参数,简称实参
函数的参数传递过程
1)形参变量只有在被调用时才分配内存单元在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数 调用结束返回主调函数后则不能再使用该形参变量。
2)实参可以是常量、变量、表达式、函数等 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3)实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
六、函数的返回值
函数的值(或称函数返回值)是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
使用注意事项
1) 函数的值只能通过return语句返回主调函数。
2) 函数返回值的类型和return实际返回的值类型应保持一致。如果两者不一致,则以return 实际类型为准,自动进行类型转,最后转换成返回值类型返回.
3) 如函数值为整型,在函数定义时可以省去类型说明。 也就是说如果没有指定返回类型, 那么C语言默认是int的类型(开发中不要省略返回值类型)
4) 不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。 为了使程序 有良好的可读性并减少出错, 凡不要求返回值的函数都应定义为空类型。
七、函数的嵌套使用
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。
int sum(int x,int y){ int z = x + y; return z; } int main(int argc, const char * argv[]) { int s1 = sum(sum(3, 4), 5); printf("%d\n",s1); return 0; }
八、递归函数
一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。
递归函数构成条件:
1)自己调用自己 2)存在一个条件能够让递归结束3)问题的规模能够缩小
递归函数的执行有两个阶段:
1)递推阶段:问题规模缩小的过程 2)回归迭代:迭代计算值得过程
递归的优点和缺点:
优点是:遇到问题规模能够缩小,而且有规律的问题的时候,代码比较简洁
缺点:消耗内存,建议在程序中不能用太多
递归举例:求N的阶乘
#include <stdio.h> int jiecheng(int n ){ int jie; //判断是否等于1 if(n==1){ jie = 1; }else{ jie = jiecheng(n-1)*n; } return jie; } int main(int argc, const char * argv[]) { // 用递归求N的阶乘 // 5!=4!*5 // 4!=3!*4 // ... // n!=(n-1)!*n int s = jiecheng(5); // 打印结果 printf("%d\n",s); return 0; }
相关文章推荐
- c++ new
- Partition List | LeetCode 8ms C++Solution
- 基于Huffman树的文件压缩原理及C语言实现(二)
- A.挑战密室
- C++ Primer 学习笔记——函数(二)
- C++指针的引用理解
- C++ socket编程
- C语言函数堆栈的思考
- C++静态分析工具
- C++ 文件里面调用C文件里面的函数——extern "C" 用法解析
- C++标准库Vector & Iterator
- C语言中快速排序和插入排序优化的实现
- 【C语言】【指针相关知识小结】
- C++primer plus第六版课后编程练习答案3.7
- C语言实现链表之双向链表(十五)测试用例
- C语言实现链表之双向链表(十四)链表打印
- C语言实现链表之双向链表(十三)获取数据对应的结点
- C语言实现链表之双向链表(十二)判断链表是否为空和获取链表长度
- C++屏蔽Windows中文输入法
- C++primer plus第六版课后编程练习答案3.5