重生之第一眼初见函数

一.

什么是函数?

  • 函数是一块代码,接收0个或多个参数,做一件事情,并返回0个或一个值

  • 可以先想像成数学中的函数:

    • y=f(x)

函数定义

  • 函数头(返回类型)(函数名)(参数表)//参数用逗号分割

  • 函数体

调用函数

  • 函数名(参数值);

  • ()起到了表示函数调用的重要作用

    • 即使没有参数也需要()

  • 如果有参数,则需要给出正确的数量和顺序

  • 这些值会被按照顺序依次用来初始化函数中的参数

函数返回

  • 函数知道每一次是哪里调用它,它会返回到正确的地方

从函数中返回

  • return停止函数的执行,并送回一个值

  • return;

  • return 表达式;

  • 一个函数中可以出现多个return语句

没有返回值的函数

  • void 函数名(参数表)

  • 不能使用带值的return

  • 可以没有return

  • 调用的时候不能做返回值的赋值

二.

函数的先后关系

//定义自己的函数(求和)
void sum (int begin, int end)
{
    int i;
    int sum=0;
    for( i=begin; i<=end; i++ ){
        sum +=1;
    }
    printf("%d到%d的和是%d\n", begin, end, sum);
}
​
int main()
{
    sum(1,10);
    sum(20,30);
    sum(35,45);
​
    return 0;
}
  • 像这样把sum()写在上面,是因为:

  • c的编译器自上而下顺序分析你的代码

  • 在看到sum(1,10)的时候,他需要知道sum()的样子

  • 也就是sum()要几个参数,每个参数的类型如何,返回什么类型

  • 这样它才能检查你对sum()的调用是否正确

# include <stdio.h>
​
void sum (int begin, int end);   //声明
​
int main()
{
    sum(1,10);
    sum(20,30);
    sum(35,45);
​
    return 0;
}
​
void sum (int begin, int end)    //定义
{
    int i;
    int sum=0;
    for( i=begin; i<=end; i++ ){
        sum +=1;
    }
    printf("%d到%d的和是%d\n", begin, end, sum);
}

函数原型

  • 函数头,以分号“;”结尾,就构成了函数的原型

  • 函数原型的目的是告诉编译器这个函数长什么样子

    • 名称

    • 参数

    • 返回类型

  • 旧标准习惯把函数原型写在调用它的函数里面

  • 现在一般写在调用它的函数前面

  • 原型里面可以不写参数的名字,但一般仍然写上

三.

调用函数

  • 如果函数有参数,调用函数时必须传递给它数量、类型以及正确的值

  • 可以传递给函数的值是表达式的结果,这包括:

    • 字面量

    • 变量

    • 函数的返回值

    • 计算的结果

类型不匹配?

  • 调用函数时给的值与参数的类型不匹配是c语言传统上最大的漏洞

  • 编译器总是悄悄的替你把类型转化好,但是这很可能不是你所期望的

  • 后续的语言,C++/Java在这方面很严格

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);
​
    return 0;
}
​
void swap(int a, int b)
{
    int  t = a;
    a = b;
    b = t;
}

这样的代码不能交换a和b的值 C语言在调用函数时,永远只能穿值给函数

传值

  • 每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系

  • 过去,对于函数参数表中的参数,叫做“形式参数”,调用函数时给的值,叫做“实际参数”

  • 我们认为,它们是参数和值的关系

四、

本地变量

  • 函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量

  • 定义在函数内部的变量就是本地变量

  • 参数也是本地变量

变量的生存期和作用域

  • 生存期:什么时候这个变量开始出现了,到什么时候它消亡了

  • 作用域:在(代码的)什么范围内可以访问到这个变量(这个变量可以起作用)

  • 对于本地变量,这两个问题的答案是统一的:大括号内————块

本地变量的规则

  • 本地变量是定义在块内的

    • 它可以是定义在函数的块内

    • 也可以定义在语句的块内

    • 甚至可以随便拉一对大括号来定义变量

  • 程序运行进入这个块前,其中的变量不存在,离开这个块,其中的变量就消失了

  • 块外面定义的变量在里面仍然有效

  • 块里面定义了和外面同名的变量则掩盖了外面的

  • 不能在一个块内定义同名变量

  • 本地变量不会被默认初始化

逗号运算符?

  • 调用函数时的逗号和逗号运算符怎么区分?

  • 调用函数时的圆括号里的逗号是标点符号,不是运算符

    • f(a,b)

    • f((a,b))

函数里的函数?

  • C语言里不允许函数嵌套定义

五、

素数求和

# include <stdio.h>
//定义自己的函数(求素数)
int isprime(int i)
{
    int ret = 1;
    int k;
    for( k=2; k<i-1; k++){
        if( i%k == 0){
            ret = 0;
            break;
        }
    }
    return ret;
}
​
int main()
{
    int m,n;
    int sum =0;
    int cnt =0;
    int i;
​
    scanf("%d %d", &m, &n);
    if (m==1) m=2;
    for ( i=m; i<=n; i++ ){
        if(isprime){
            sum +=i;
            cnt++;
        }
    }
    printf("%d %d\n", cnt, sum);
​
    return 0;
}
​

求和函数

//定义自己的函数(求和)
void sum (int begin, int end)
{
    int i;
    int sum=0;
    for( i=begin; i<=end; i++ ){
        sum +=1;
    }
    printf("%d到%d的和是%d\n", begin, end, sum);
}
​
int main()
{
    sum(1,10);
    sum(20,30);
    sum(35,45);
​
    return 0;
}

void(返回类型): sum函数不返回任何东西,没有结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘志达@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值