3.C语言——函数

函数

1.什么是函数

函数也称为子程序,在计算机科学中,子程序是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软 件库。

2.函数的分类

1.库函数

库函数就是C语言本身给我们已经定义好的函数,作为程序员我们可以直接使用,就像printf()和scanf()。

注意:使用库函数必须包含头文件,例如我们使用printf()与scanf()时要引用stdio.h头文件,即我们通常写的#include<stdio.h>

常见的库函数有IO函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数,其他库函数,后期用到的时候具体讲解。

2.自定义函数

自定义函数就是程序员自己定义用于实现特定功能的函数!这给程序员一个很大的发挥空间。

c 复制代码
格式:
return_type function_name( parameter list )
{
   body of the function
}
  • 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
  • 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。

根据有无返回值可将函数分为有返回值函数,无返回值函数

有返回值的函数就返回一个值,而无返回值的函数就执行某些操作

根据有无参数可将函数分为有参函数,无参函数

例如:无参有返回值的函数

有参有返回值的函数

3.函数的参数

1.实际参数(实参)

真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。

2.形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

4.函数的声明

1.同一个文件的函数声明

一般如果把自定义函数写在了主函数后,一般要进行声明。函数声明会告诉编译器函数名称及如何调用函数

c 复制代码
格式:
return_type function_name( parameter list );

上面的add函数声明为:
写在主函数main()的上面

c 复制代码
int add(int a,int b);

正确示例:

2.多文件的函数声明

我们在设计多文件程序的时候,一般在以.h为结尾的头文件内放置函数的声明在.c源文件内放置函数的定义
math.h的内容
放置函数的声明

c 复制代码
#ifndef __MATH_H__
#define __MATH_H__ 
   int max(int x, int y); 
   int min(int x, int y);
#endif 

math.c的内容
放置函数的实现

c 复制代码
#include "math.h" 
int max(int x, int y) { 	
    return x > y ? x : y;
  } 
int min(int x, int y) { 
	return x < y ? x : y; 
} 

主函数为

c 复制代码
#include<stdio.h>
#include"math.c" 
int main() { 
	int a = 10; 	
	int b = 20; 	
	printf("max=%d\n", max(a, b)); 	
	printf("min=%d\n", min(a, b)); 
} 

5.函数的调用

创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务

当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:

6.函数的嵌套调用和链式访问

1.嵌套调用

特别注意:C语言中,函数可以嵌套调用,但是不能嵌套定义

2.链式访问

通俗来讲,链式访问就是把一个函数的返回值作为另外一个函数的参数

貌似与嵌套调用挺像的,但两者是存在区别的:嵌套调用是在函数中调用函数,而链式访问则是将一个函数的返回值作为另一个函数的参数。

c 复制代码
#include <stdio.h>
int main()
{
    printf("%d", printf("%d", printf("%d", 43)));
    //结果是啥?
    //注:printf函数的返回值是打印在屏幕上字符的个数
    return 0;
}

打印结果是什么呢?最后的打印结果是4321,为什么呢?此处给大家普及一个知识点,printf()函数的返回值是正确输出在屏幕上的字符数,例如,输出在屏幕上的数字是43,此时函数的返回值就是2,如果打印在屏幕上的数字是2的话,返回值就是1,那么此处输出的结果也就不难理解了。

另外一个给大家补充的点是:在上面这个函数中,究竟是如何进行执行的呢?首先执行的是最外层的printf()函数,而最外层函数的返回值依赖于次外层函数的返回值,而次外层函数的返回值又依赖于内层函数的返回值,就是层层向内调用然后层层返回。printf("%d",43)的返回值是2,而printf("%d",2)的返回值是1,所以最终输出在屏幕上的就是4321,因为最内层函数先执行进行输出的,所以也可以理解成是由内向外进行执行的,但调用的顺序却是由外向内的。

7.函数递归

程序调用自身的编程技巧称为递归( recursion)。

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的条件

(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续。

(2)每次递归调用之后越来越接近这个限制条件。

c 复制代码
int factorial(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * factorial(n - 1);
}
相关推荐
hccee18 分钟前
C# IO文件操作
开发语言·c#
hummhumm23 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
J老熊33 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
寻找码源43 分钟前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
zmd-zk1 小时前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
好奇的菜鸟1 小时前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.01 小时前
Go语言进阶&依赖管理
开发语言·后端·golang
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
手握风云-1 小时前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟1 小时前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构