5.9_C语言_函数2

1、函数的嵌套调用和链式访问

函数和函数之间可以根据实际的需求来进行组合的,也就是互相调用。

1.1 嵌套调用

#include<stdio.h>
void new_line()
{
	printf("hehe\n");
}
void three_line()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		new_line();
	}
}
int main()
{
	three_line();
	return 0;
}

函数可以嵌套调用,但是不能嵌套定义

错误示范:

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
	int Sub(int x, int y)//把这个Sub定义放在这个Add函数内部了,这叫嵌套定义了,是绝对做不到的
	{
		return x - y;
	}
}
int main()
{

	return 0;
}

1.2 链式访问

把一个函数的返回值作为另外一个函数的参数。

 链式访问依赖的是函数的返回值

#include<stdio.h>
#include<string.h>
int main()
{
	int len=strlen("abcdef");//求字符串长度
	printf("%d\n", len);

	//链式访问
	printf("%d\n", strlen("abcdef"));//strlen的返回值做了这个printf的参数

	return 0;
}

结果:

 再看一个:

#include<stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 43)));

	return 0;
}

结果:

 

分析:

 链式访问的前提条件是函数得有返回值。

下面这个写法不推荐

#include<stdio.h>
Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

 这个代码是可以运行出正确结果的,但如果不知道函数不写返回值的时候,默认返回类型是int这个点的时候,是会看不懂得。不建议这样写,不要这里放个模棱两可的这种写法。

//这个void明确的说明,mian函数不需要参数
//但是本质上mian函数是有参数的
int main(void)
{
    return 0;
}

//main函数其实有三个参数
int main(int argc,char* argv[],char *envp[])
{
    return 0;
}

2、函数的声明和定义 

2.1 函数的声明:

1、告诉编译器一个函数叫什么,参数是什么,返回类型是什么,但是具体是不是存在的,函数声明决定不了。

2、函数的声明一般出现在函数使用之前。要满足先声明后使用

3、函数的声明一般要放在头文件中。

2.2 函数定义:

函数的定义是指函数的具体实现,交代函数的功能实现。

#include<stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//加法
	int sum=Add(a, b);
	printf("%d\n", sum);
	return 0;
}
//函数的定义
int Add(int x, int y)//交代了函数的名字是什么,参数类型是什么,
//但是里面最重要的是还交代了这个函数是怎样运行的
{
	return x + y;
}

 结果:运行的了,但会有一个警告

所以我们要在书写的时候最好保持这样,把这个代码放到前面定义。

#include<stdio.h>
//函数的定义
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//加法
	int sum=Add(a, b);
	printf("%d\n", sum);
	return 0;
}

前面定义的时候,编译器在扫描的时候,就见过这个Add函数了,然后再往下走的时候调用这个Add函数,就没问题了。

但如果此时,我们就想把函数定义在后面,也可以,那怎么做呢,那其实就是在前面进行一个函数的声明。

#include<stdio.h>

//函数的声明
int Add(int x, int y);//注意,这个地方的x和y写不写都可以,我只需要知道函数的返回类型是什么,参数是什么,参数有几个,分别类型是什么

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	//加法
	int sum=Add(a, b);
	printf("%d\n", sum);
	return 0;
}

//函数的定义
int Add(int x, int y)
{
	return x + y;
}

所以,函数声明其实就是告诉你我有一个函数是什么。

而函数定义呢,就是我要真真实实的创造这一个函数,就是这个函数有没有存在,取决于函数的定义。 

2.3 另外讲:

函数的声明一般要放在头文件中。这句话是什么意思呢?

前面讲了这个函数的声明和函数定义的案例,这个

但如果真的有这样一个案例这话,其实如果我们把加法这个功能呢看成一个模块,那这个时候我会这样写代码:

把函数的声明放到这个 Add.h 里面,把这个函数的定义放到这个 Add.c 里面去(这样)

当我把他拆开之后呢 ,注意,如果你想在这个 test.c 里面想使用这个加法的功能,应该怎么做。

只需要 #include"Add.h"这样就可以了

你包含了这个头文件,这个时候呢,这个加法功能就可以正常使用了

结果:

那对于刚刚这个,我们把这个代码写成了Add.h 和Add.c 的时候呢,注意,我们把这两个文件叫一个模块,叫一个加法模块,写好之后呢,别人只要想用,只要包含这个头文件( #include"Add.h" )就可以了。

如果是你自己写的头文件,用双引号就可以了,如果是用这种库里面提供的这种头文件,比如说stdio.h这种的时候,就一定要写成尖括号。至于他俩有什么区别,暂时还没学。

那为什么原来在一个文件里面能搞定的代码,非要搞成三个文件去写呢?

模块化,注意,如果一个  .c  文件里面放一万多行代码,那阅读体验就非常的差了,如果把多个功能按模块划分开来,那这个时候是不是在阅读,在维护这个代码的时候也更容易。

合作的角度,一个test.c文件,100个开发人员,这100个人不可能都把自己的代码写到一个 test.c 文件里面去

业务拆分:

实现一个计算器

1、加法  add.h  add.c   ----A程序员

2、减法  sub.h  sub.c   ----B程序员

3、乘法  mul.h   mul.c  ----C程序员

4、除法  div.h  div.c      ----D程序员

每个人都写自己的模块,把自己的模块实现好之后,再把这些模块拼装在一起,最终就可以实现这个计算器了。  (这里面进行了一个很好的模块的划分)

那为什么非要把一个加法的一个代码,拆成两个文件,一个函数的定义,一个函数声明这样做呢?

当把这个 .h 文件单独拆出来(这里面是函数声明),如果我这 test.c 文件里面包含#include "Add.h",那么此时包含这个头文件的一个基本的效果是什么呢,基本的意义是什么呢。

包含这个头文件( Add.h )的时候他就会把头文件的内容拷贝过来,那拷过来的代码往这一放,其实就相当于函数声明。

  • 37
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值