3.1 传参时的小知识点:默认值的使用与规则
#include <iostream>
using namespace std;
void foo(int a, int b = 10) // 这是传的两个参数。
{
cout << a << ' ' << b << endl;
}
int main()
{
foo(5); /*这里只给a赋了值,没给b赋值,但是函数foo里面有初始值b=10,所以还是可以输出,
结果为 5 10*/
foo(5, 3); /*这里输入a=5,b=3,哪怕b已经有了默认值10,也是输出的 5 3。*/
/*从这里就可以看出结论:当多个参数中有参数没赋值的时候,若是调用的函数里面已有初始值,那么就自动的使用
初始值;若是有初始值还输入一个值,那么就不用初始值,就用输入的那个值。
这个初始值有点备用的意思。*/
return 0;
}
/*注意,赋初始值是有规则的。你要么全部都赋初始值,要么就第一个初始值不赋值,剩下的都赋值。不能断断续续的
赋值,因为内存是连续的,你断断续续的赋值,就不符合规则了。*/
3.2 返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return语句有两种形式:
return;
return expression;
3.3无返回值函数
没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return。所以一般void类型的函数后面不写return。
通常情况下,void函数如果想在它的中间位置提前退出,可以使用return语句。return的这种用法有点类似于我们用break语句退出循环。
#include <iostream>
using namespace std;
int max(int x, int y)
{
if (x > y)
return x;
/*当我输入4 3 时,输出的只有4。说明语句到return x就截止了,退出了这个函数。后面的语句没运行到*/
puts("hello world!");
return y;
/*当我输入3 4 时,输出的结果时:hello world! 4 。前面的语句不符合条件,直接运行后面的语句,从这
就已经可以看出return 语句表示结束并跳出这个函数,返回所得到的值。*/
}
int main()
{
int a, b;
cin >> a >> b;
cout << max(a, b) << endl;
return 0;
}
总结:return 语句是函数是什么类型就返回什么类型的值。例如这里是int型函数,那么返回的x,y值都是int型。
3.4 函数调用的过程(有图分析)
示例代码如下:
#include <iostream>
using namespace std;
void goo()
{
puts("call go");
}
void foo()
{
puts("call fo");
goo();
goo();
}
int main()
{
foo();
foo();
return 0;
}
上面的代码看起来十分繁琐,一会儿调用这个函数,一会儿调用那个函数,可是,我们只要画一个图,仔细分析,就会发现他的规律,这对我们以后学习数据结构里面的树做一点小小的基础。

我画的这张图就已经很清晰的表示了调用函数的过程。语言描述就是:首先进入main函数,main函数里面有两个foo函数,那就 先调用第一个foo函数,发现foo函数里面有两个goo函数,那么先调用第一个goo函数,执行里面的操作,并把结果返回给第一个foo函数,因为一个foo函数里面要调用两次goo函数,那么另一次调用也与上一次调用goo函数的流程和操作是一样的,那么最终foo函数会得到最终的结果,然后这最终的结果又返回给main函数。main函数里面的另一个foo函数操作也是如此,组后结合两次的结果合在一起就是最终结果了。所以输出为:
call fo
call go
call go
call fo
call go
call go
总结:从这个例子我们可以发现,函数的调用是层层递进的,是你要调用哪个函数就先进入哪个函数内,把执行的结果返回后再接着执行下面的语句。这就不像以前没有调用函数,只在main函数里面写,里面的代码语句执行是按顺序进行的,这一点得注意。
还有,从这个调用函数的过程图我们可以观察出,函数调用与返回他的值是双向的,而且各个之间是没有交叉的,形成像树一样的结构,给人一种很强的立体感。这个树在后面数据结构里面会有,我只是大致了解一点,等到了后面彻底学懂了再说吧。
3.4 函数递归
在一个函数内部,也可以调用函数本身。
下面用一个示例代码来具体看看:
#include <iostream>
//递归的一个简单例子:求阶乘
using namespace std;
int fact(int n)
{
if (n <= 1)//0的阶乘也是1,差点给忘了。
return 1; //1的阶乘是1。
//只要n不是1,那么就返回下面这个式子。
return n * fact(n - 1);
}
int main()
{
int b = fact(5);//调用fact函数求阶乘。
cout << b << endl;//输出结果。
return 0;
}
和上面一样,我画这个阶乘的执行过程图,毕竟咱是新手,多画画总有帮助。

从上面的图可以看出,
if (n<= 1)
return 1;这一句是必要的。虽然我们知道1的阶乘是1,0的阶乘也是1,也要写出来。因为这一句不仅表示了这两个特殊取值,也是一个边界,当n逐步递减到1时,那么就结束函数,返回最终的结果。看懂了这个题,那递归你也就懂了。
3952



被折叠的 条评论
为什么被折叠?



