【c语言跟练】笔记4-函数

引言

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值