6 函数
6.1 函数的定义
求平方根函数r = squrt(100.0);
已知底数x
,幂指数y
,求幂函数k = pow(x, y);
求一个字符串的长度i = strlen(str1);
比较两个字符串的大小v = strcmp(str1, str2);
把字符串转换为相应的整数n = atoi(str1);
返回值类型 函数名(参数列表)
{
函数体语句
return 表达式
}
根据需要可以定义有无返回值,有无输入参数。main
也可以带输入参数。
6.2 函数的声明
函数定义的位置可以在main
之前,也可以在main
之后。
如果函数定义写在main
之前,就不用写函数的声明;
如果函数定义在main
之前,就要写上函数声明float max(float, float);
,它也叫函数的原型。函数的原型=返回值类型 + 函数名 +参数类型。
6.3 函数的执行
每一个函数都开辟一块新的空间。
6.4 全局变量 vs 局部变量
当全局变量与局部变量同名时,局部变量将在自己作用与内有效,他将屏蔽同名的全局变量。
不在非必要情况下,不要使用全局变量。
#include<iostream>
using namespace std;
int a = 0, b = 0;
void exchange(int a,int b)
{
int p;
if (a < b)
{
p = a; a = b; b = p;
}
}
int main()
{
a = 3; b = 5;
exchange(a,b);
cout << a << ' ' << b << endl;
system("pause");
return 0;
}
#include<iostream>
using namespace std;
int a = 0, b = 0;
void exchange()
{
int p;
if (a < b)
{
p = a; a = b; b = p;
}
}
int main()
{
a = 3; b = 5;
exchange();
cout << a << ' ' << b << endl;
system("pause");
return 0;
}
6.5 数组与函数
数组元素做函数参数
#include<iostream>
using namespace std;
void change(int a,int b)
{
a = 30; b = 50;
}
int main()
{
int a[2] = { 3,5 };
change(a[0], a[1]);
cout << a[0] << ' ' << a[1] << endl;
system("pause");
return 0;
}
数组名做函数参数。数组名代表地址,地址COPY了。
#include<iostream>
using namespace std;
void change(int a[])
{
a[0] = 30; a[1] = 50;
}
int main()
{
int a[2] = { 3,5 };
change(a);
cout << a[0] << ' ' << a[1] << endl;
system("pause");
return 0;
}
6.5 函数的分文件编写
1、创建后缀名为.h
的头文件;
2、创建后缀名为.cpp
的源文件;
3、在头文件中写函数声明;
4、在源文件中写函数定义。
函数是C程序的基本构成单位
一个C程序由一个或者多个源程序文件组成。
一个源程序文件可以由一个或多个函数组成。
函数是有类型的,函数的返回值就是函数的数据类型。
max.h
和compare.cpp
放在在同一目录。通过include "max.h"
将两个函数连接起来。使用“”
,而不使用<>
,与编译器的默认路径有关,<>
默认搜索系统的函数库,“”
搜索当前目录。
6.6 函数的递归
函数不能嵌套定义,所有函数一律平等;
函数可以嵌套调用,无论嵌套多少层,原理都一样。
函数可以调用自己。例如求n!
阶乘。
#include<iostream>
using namespace std;
int fact(int n)
{
if (n == 1)
return 1;
else
return n * fact(n - 1);
}
int main()
{
int n = 3;
cout << fact(n) << endl;
system("pause");
return 0;
}
递归的过程:
1 递归应用实例
切饼
#include<iostream>
using namespace std;
int q(int n)
{
if(n==0)
return 1;
else
return(n + q(n - 1));
}
int main()
{
cout << q(4) << endl;
system("pause");
return 0;
}
把关注点放在要求解得目标上,进而找到第n次于第n-1次之间的关系,确定第1次的返回结果。
2 内联函数
函数调用是有时间开销的,需要参数入栈,复制。如果函数本身只有几条语句,执行非常快,函数被反复执行很多次,相比之下调用函数产生的开销就很大。为了减少开销,引入内联函数
。处理内联函数时,将整个代码插入到调用语句,缺点代码量大。
在函数定义前面加inline
关键字,即可定义内联函数。
inline int Max(int a,int b)
{
if(a > b)
return a;
else
return b;
}
3 函数重载
名字相同,参数个数不同
4 函数缺省参数
void func(int x1, int x2 = 2, int x3 = 3){ }
func(10);//等效func(10, 2, 3)
func(10, 8);//等效func(10, 8, 3)
func(10, , 8);//不行,只能连续若干个连续参数缺省