引言
1.什么是函数
函数是一块代码,接收0或多个参数,做一件事情,返回0个或1个值。
课堂练习1-求某个范围内素数的和
#include <stdio.h>
int isPrime(int num)
{
int ret = 1;
int i;
for (i = 1; i <= num; i++) {
if (num % i == 0) {
ret = 0;
break;
}
}
return ret;//返回值
}
int main()
{
int M = 10;
int N = 31;
int num;
int count = 0;
int sum = 0;
for (num = M; num <= N; num++)
{
if (isPrime(num))
{
count++;
sum += num;
}
}
printf("%d %d", count, sum);
return 0;
}
课堂练习2-求1~10,20~30,35~45三个区间段的和
//stu
#include <stdio.h>
// Σ min ~ max
int defSUM(int min, int max)
{
int i;
int ret = 0; //④可以同名
for (i = min; i <= max; i++) {
ret += i;
}
return ret; // ①int必须有返回值
}
int main()
{
int sum = defSUM(1, 10) + defSUM(20, 30) + defSUM(35, 45);
printf("sum = %d", sum);
return 0;
}
//tea
#include <stdio.h>
void sum(int min, int max) //void
{
int i;
int sum = 0; //③不同名也行
for (i = min; i <= max; i++) {
sum += i;
}
printf("%d到%d的和是%d\n", min, max, sum);
} //②void不能有返回值
int main()
{
sum(1, 10); //直接用
sum(20, 30);
sum(35, 45);
return 0; //返回值
}
2.为什么需要函数
避免代码重复,方便后期维护
第七章 函数
1.函数定义
函数头 —— { 函数体 }
函数头:返回类型 -- 函数名 ( 参数表 )
其他:
函数体内可以有与函数名同名的变量(大概类似地球和我的关系
int defSUM() //计算机会以为传递的数有很多可能,它就会勤勤恳恳的找
{
int defSUM = 0;
……
}
参数表:
①如果压根没参数——但由于计算机错意为千万种可能,所以要指明没有参数void;
int defSUM() //计算机会以为传递的数有很多可能,它就会勤勤恳恳的找
{
……
}
int defSUM(void) //所以最好指明啥也没有
{
……
}
②如果参数只指定了类型,然后没有其他——是可以的么
int defSUM(int ,int)
{
……
}
③如果参数指定了类型和变量名——后续调用变量也可以不一样,完全没影响
int defSUM(int min ,int max)
{
……
}
//后续调用
int a = 3;
int b = 4;
defSUM(a ,b);
//或者
defSUM(3 ,4);
//还能把结果赋值
int num = defSUM(3,4);
2.函数调用
中心思想
函数调用就是传值,注意传值,不是传变量
一般格式
函数名(参数值)
int defSUM(int min, int max)
{
int i;
int ret = 0;
for (i = min; i <= max; i++) {
ret += i;
}
}
int main()
{
defSUM(10,20); //函数的调用
}
注意事项
圆括号()很重要,没有参数也要写。
参数
int defSUM(int a, int b);
↑ ①如果有参数:定义有几个参数,就需要传递几个参数;定义什么类型,就需要传递什么类型:
给出正确的数量和顺序,这些值会被计算机按照顺序依次用来初始化函数中的参数
如果调用到的变量和函数体内定义的变量不一样——完全没影响,不同的变量空间,值到位就行
int defSUM(void);
↑ ②如果没参数:要在参数位置写上void
int defSUM();
↑ ③如果只有圆括号:这种情况不表示没有参数,勤劳的计算机会自己猜你想传递的是啥(duck不必
传递的值
如果函数有参数,调用时必须传递给它数量、类型正确的值
可以传递给函数的值是表达式的结果
max(10,12); //字面量
max(a,b);//变量
max(max(10,12),b);//函数返回的值
max(10+34,12)//计算的结果
类型不匹配:c语言编译器不够严格,传递类型不符,可能也不会报错,会影响程序正常运行
3.函数返回值
注意事项
没有return:大括号也会自定结束,适用于没有返回值的情况
有return:return 就直接结束程序,返回后面的值/变量&没有返回值
return;//不返回参数
return 0;//返回值是0
return ret;//返回变量ret的值
返回值
情况一:有返回值
一般格式:如果函数有返回值,必须是带值的return
其他:一个函数可以有多个返回值,但不建议——出口太多,后期大程序不好改
int Fetch(int a, int b)
{
if (a > b) {
return a; //1
}
else {
return b; //2 多个返回值
}
}
情况二:没有返回值
一般格式:void 函数名(参数表)
其他:可以有return但不能带值
注意:调用的时候不能作为返回值的赋值
返回值去向
可以直接用(丢弃)
可以赋值给变量
可以传递给函数
defSUM(1,2);
a = defSUM(1,2);
defSUN(defSUM(1,2),3);
4.函数先后关系
情况一:被调用的函数放上面,主函数main放下面
int defSUM(int a, int b) //定义
{
……
}
int main() //主函数
{
……
}
情况二:被调用放下面,主函数放上面,但得先声明函数
int defSUM(int a, int b);//声明
int main() //主函数
{
……
}
int defSUM(int a, int b) //定义
{
……
}
补充说明:
编译器自上而下分析代码
5.函数声明
一般格式
函数原型声明 -- 主函数 --函数定义
#include <stdio.h>
int defSUM(int a, int b);//声明
int main() //主函数
{
……
}
int defSUM(int a, int b) //定义
{
……
}
注意事项
声明的目的是告诉编译器在调用函数前,知道函数长什么样,包括名称、参数(数量及类型)、返回类型
声明名称、参数(数量及类型)、返回类型要和函数题头一模一样,不然报错
声明一般放在主函数外面
声明可以不用写明变量名称/名称不一致也没关
void defSUM(int a, int );//声明
……
void defSUM(int begin, int end)//定义
{
……
}
6.变量空间/作用域/生存期
void SWAP(int a, int b)
{
int t = b;
b = a;
a = t;
}
int main()
{
int a = 5;
int b = 6;
SWAP(a, b);
printf("a = %d,b = %d\n", a, b); //结果此a非彼a,并没有实现值得交换
return 0;
}
思考:传递过去的是什么?
c语言在调用函数时,永远只能传值给函数
简介
变量空间:每个函数都有自己的变量空间,参数也位于这个独立的空间中,与其他函数没有关系
理解就是:不同函数就是不同的生存域(变量空间),在这个域内的定义的变量只在这个域生存、起作用(作用域),时间上就是(生存期)——(类似,穿越到不同平行空间
生存期:什么时候变量开始出现了,到什么时候它消亡了
作用域:在(代码的)什么范围内可以访问这个变量,也即(这个变量可以起作用)
void SWAP(int a, int b);
int main()
{
int a = 5;
int b = 6;
SWAP(a, b);
printf("a = %d,b = %d\n", a, b); //结果此a非彼a,并没有实现值得交换
return 0;
}
void SWAP(int a, int b)
{
int t = b;
b = a;
a = t;
}
形参与实参
函数定义/声明种参数表对应得是“形式参数(形参)”,调用对应“实际参数(实参)”
7.本地变量
定义规则
定义在函数块内
int main()
{
int a = 0;
}
定义在语句块内
if ( a > 0){
int isHHH = 3;
}
定义在随意的大括号块里
{
int a = 0;
}
那可以#巴拉巴拉后面么
注意事项
程序运行进入这个块之前,其中的变量不存在;离开这个块,其中的变量就消失了
块外面定义的变量在里面仍然有效
——外面到里面仍然生效,反之不然
块里面定义和外面同名的变量则掩盖外面的
不能再一个块内定义同名的变量
本地变量不会被默认初始化
参数在进入函数时被初始化了
8.其它
1.调用函数用到的逗号和逗号运算符怎么区分?
双层圆括号内的逗号是运算符,f((a,b)) vs. f(a,b)
2.能不能在函数里定义其他函数?
不允许。可以在一个函数里放另一个函数得声明(也不建议,建议独立出来放外面),但不能放定义。
3.一些随意的代码行为
//不建议这么写!!!!!
int i,sum(a, int b); //这是啥??
return (i);//圆括号是运算符,在这里用没意义,还容易让人误会是
4.关于int main()
也是函数,有返回值,可以被调用
要不要写成int main(void)