函数讲解(3)--函数的嵌套调用,链式访问与声明定义
目录
二.函数的访问方式之链式访问
三.函数的定义和声明
1 函数声明:
2 函数定义:
一.函数的嵌套调用
定义:当程序执行函数的时候,会发现函数中存在着另一个函数,在函数中调用函数,被称为嵌套式调用
#include <stdio.h>
void test1()
{
printf("hello world!\n");
}
void test2()
{
int i = 0;
for(i=1; i<5; i++)
{
test1();
}
}
int main()
{
test2();
return 0;
}
调用第一个函数后进入,在循环体中调用第二个函数,就好比循环的嵌套一样外层循环先执行一次,里层的循环就执行一圈,嵌套函数也是如此。
需要注意的是:函数间只能嵌套调用,不可嵌套定义,那什么是嵌套定义?如下图代码(错误例子示范)
//嵌套定义的错误示范
int Add(int x, int y) {
int Sub(int x, int y) {
return x - y;
}
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum = Add(a,b);
printf("%d\n", sum);
return 0;
}
上图代码就是在一个函数中嵌套定义了另一个函数,这是万万不可的,而且系统会报错,是非法的代码。我们应该清楚的了解到:每一个函数之间都是独立的,可以根据实际的需求相互组合,也就是互相调用,但就是不允许嵌套定义!!!
二.函数的访问方式之链式访问
定义:把一个函数的返回值作为另外一个函数的参数。
下面来看实验操作
当我们需要计算数组的长度时,需要创建一个变量去接收strlen的返回值,然后输出变量才能知道数组的长度,有些费时间,费空间。其实有一种更方便快捷的访问方法--链式访问。如下图所示。
链式访问其实就是将两个或多个结构像链子一样关联起来,A可以通过链子的方向找到B的所在地,B也可以通过链子反向找到A。如下图所示。
strlen函数经过计算后,会返回一个整形数值,返回的值作为printf函数的参数进行输出。
int main() {
printf("%d", printf("%d", printf("%d", 99)));
return 0;
}
请各位来做一下这道题,计算一下最终结果。
代码讲解:首先这道题采用了三个printf函数,printf函数也有相应的返回值,而它的返回值就是输出的字符数量,返回值是是输出的字符数量,包括数字,字母,标点符号,空格等。
通过这个知识点,我们可以从里到外进行分步计算。
首先最里面的printf输出的是99,99是两位数,那么返回的就是2个字节,将返回的值作为第二个printf的参数,会输出2,“2” 是1位数,所以会返回1个字节,1会作为最后一个printf函数的参数,输出1。所以最终的结果就是9921。各位想必已经了解了链式访问的基本方法了吧。
三.函数的定义和声明
1 函数声明:
a. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。 但是具体是不是存在,函数声明决定不了。
b. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
c. 函数的声明一般要放在头文件中的。
2 函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。
首先来看函数声明,声明通过字面意思就可以知道他是用来向程序宣布它的存在的。
就好比一个男生和喜欢的女孩恋爱了,男生向微信朋友圈官宣了她名草有主了hhh,这也就是间接告诉了朋友们他有女朋友了,她女朋友叫啥长啥样子,这样朋友们脑袋中也就会get到这个信息,到时候见到他俩在一起就不会感到诧异和惊奇了。这么说大家应该懂了声明的意义了。就是为了让程序知道它的存在。
int Add(int, int);//函数声明
int main() {
int a = 10;
int b = 20;
int sum = Add(a,b);
printf("%d\n", sum);
return 0;
}
//函数定义
int Add(int x, int y) {
return x + y;
}
当声明后,程序会进行记忆,在后面遇到Add函数后,会先跳过这个代码,继续往下执行,直到遇到此函数的操作步骤才会返回来执行。所以满足先声明后使用。很重要!
接下来讲一讲函数定义。
就如同刚才的概念一样,函数得有一个设计思路,你想让变量或者代码生成一个什么样的内容,取决于它是经过怎样定义而成的。A公司想计算两个数的乘积,但他不会算,他花钱雇了一个程序员B帮他计算,B通过自己的方法算出来了将最终将结果交给了A公司,完成了交易,然后B就走了。当A若继续想计算另外几个值的乘积,就又可以找B做交易--程序可以进行多次调用函数实现 计算。
大家需要注意的是:当要写的代码数量较少时,可以将函数声明定义放在一块,但以后在公司就业时,参与了一个代码量相当庞大的项目时,需要将函数声明与函数定义分开去书写。
举个例子。当一个项目只有一个test.c文件时,这时有100个程序猿参与完成它,总不可能等A去写完,再由B,C,D,E....一个个的轮流书写吧,那得写到何年何月才能写完?项目是需要多人进行同时协作才能完成的,比如写一个计算器项目:是需要程序员A去完成加法的声明(放在test.h头文件)和加法的功能实现(test.c),B完成减法的声明与实现......如下图
当他们完成了各自的任务,最后把每个人的代码拼接起来就可以完成一个完整的计算器项目了。这叫做模块化管理,分配任务,协同进行。
好了以上就是关于函数(4)的讲解了,希望对你们有所帮助!
仍是未完,待续h!
rexsam111: 请问怎样验证中断?
涛涛ALG: 开局暴击“ class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } // Date(const Date d) // 错误写法 Date(const Date& d) // 正确写法 _year = d._year; _month = d._month; _day = d._day; } private: int _year; int _month; int _day; }; int main() { Date d1; Date d2(d1); return 0; }”这段代码句法语法错误很多
一个小脑袋: 写得不错呀博主,继续关注!
新入坑的码农: 第三种类型里举的那个反例是否举错了?测试下来是能进行重载的
空鸣282: 第一个都是错的,构造函数没有默认参数你就直接写Data d1,你自己运行看会不会出错