嵌入式开发学习(第二阶段 C语言基础)

发布于:2025-05-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

C语言:第11天笔记

函数

函数的调用

调用方式

①函数语句:

test();            //对于无返回值的函数,直接调用
int res = max(2,4);//对于有返回值的函数,一般需要在主调函数中接受被调函数的返回值

②函数表达式:

4 + max(2,4);
scanf("%d",&num) != 1;
(c = getchar() != '\0')

③函数参数:

printf("%d",(int) fabs(number));      //函数作为实参

注意:函数可以作为函数的实参,如果要作为形参,必须使用函数指针。

在一个函数中调用另一个函数具备以下条件:

  • 被调函数必须是已经定义的函数。

  • 若使用库函数,应在本文件开头用#include包含其对应的头文件。

  • 若使用自定义函数,自定义函数又在主调函数的后面,则应在主调函数中对被调函数进行声明。声明的作用是把函数名、函数参数的个数和类型等信息通知编译系统,以便于在遇到函数时,编译系统能正确识别函数,并检查函数调用的合法性。

    int max(int 5,int 6)
    {
        return 5;
    }
    
    int main()
    {
        max(4,5);
    }
    

函数的声明

函数调用时,往往要遵循先定义后使用,但如果我们对函数的调用操作出现在函数定义之前,则需要对函数进行声明。

定义

完整的函数使用分为三部分:

  • [函数声明]

    int max(int x,int y,double z);   //函数声明只保留函数头
    int max(int,int,double);         //省略参数名称
    

    函数声明如果在同一个文件,一定要定义所有函数定义的最前面。如果有对应的.h文件,可以将函数的声明抽取到.h中。

  • 函数定义

    int max(int x,int y,double z)  //函数定义时不能省略参数的名称
    {
        return x > y
    }
    

    函数定义的时候,不能省略形参的数据类型,参数个数,参数名称,位置要和函数声明完全一致。

  • 函数调用

    int main()
    {
        printf("%d\n",max(4,5,6));
    }
    
    作用

    ​ C语言的函数声明是为了提前告诉编译器函数的名称、返回类型和参数,这样在函数实际定义之前就能安全调用它,避免编译错误,同时检查参数和返回值是否正确。相当于给编译器一个“预告”,确保代码正确编译和运行。

    使用

    错误示例:被调函数写在主调函数之后

    //主调函数
    int main()
    {
        printf("%d\n",add(12,13));//此时编译会报错,因为函数没有经过声明,编译系统无法检查函数调用的合法性
    }
    
    //被调函数
    int add(int x;int y)
    {
        return x + y;
    }
    

    正确演示:被调函数和主调函数无法区分前后,需要增加被调函数的函数声明

    //被调函数
    int add(int x;int y)
    {
        return x + y;
    }
    
    {
        printf("%d\n",add(12,13));
    }
    

    注意:如果函数的调用比较简单,如a函数调用b 函数,b函数调用a函数,无法区分前后,此时需添加函数声明。

声明的方式:

  • 函数头加上分号
int add(int a, int b);
  • 函数加上分号,可以省略形参名称,但不能省略参数类型

    int add(int,int);
    

函数的嵌套调用

定义

函数不允许嵌套定义,但是允许嵌套调用

  • 正确示例:函数嵌套调用

    void a() {...}
    
    void b()
    {
        a();
    }
    
    int main()
    {
        printf(..);
    }
    
  • 错误示例:函数嵌套定义

    void a()
    {
        void b()
       {
           ...
       }
    }
    

**嵌套调用:**在被调函数内又主动去调用其他函数,这样的函数调用形式,称之为嵌套调用。

案例
案例1
  • 需求:编写一个函数,判断给定的3~100的正整数是否是素数

  • 分析:

    • 素数:素数是大于1的自然数,除了1和它本身外,不能被其他数整除。
  • 代码

    /*************************************************************************
      > File Name:    demo01.c
      > Author:       刘孟丹
      > Description:  求素数
      > Created Time: 2025年05月16日 星期五 10时44分43秒
     ************************************************************************/
    
    #include <stdio.h>
    
    /**
     * 定义一个函数,求素数
     * @para n:需要校验素数的整数
     * @return 返回flag 1-素数,0-非素数
     */
    int is_prime(int n)
    {
        //默认是素数
        int flag = 1;
        // 循环变量
        for(int i = 2;i <= n/2;i++)
        {
            // 判断是否出现证除情况
            if(n % i == 0)
            {
                flag = 0;//非素数
                break;
            }
        }
        return flag;
    }
    
    
    int main(int argc,char *argv[])
    {
        //生成3~100之间的自然数
        for(int i =3; i<= 100;i++)
        {
            if(is_prime(i) == 1)
                printf("%-4d",i);
        }
        printf("\n");
        return 0;
    }
    
  • 运行结果

在这里插入图片描述

案例2:
  • 需求:输入四个整数,找出其中最大的数,用函数嵌套来实现,要求每次只能两个数比较。

  • 代码:

    /*************************************************************************
      > File Name:    demo02.c
      > Author:       小刘
      > Description:  
      > Created Time: 2025年05月16日 星期五 11时01分31秒
     ************************************************************************/
    
    #include <stdio.h>
    
    int max_2(int,int);
    int max_4(int,int,int,int);
    
    int main(int argc,char *argv[])
    {
        int a,b,c,d;
        printf("请输入四个整数:");
        scanf("%d%d%d%d",&a,&b,&c,&d);
        
        printf("最大的数为:%d\n",max_4(a,b,c,d));
        return 0;
    }
    
    int max_2(int a,int b)
    {
        return a > b ? a : b;
    }
    
    int max_4(int a,int b,int c,int d)
    {
        return max_2(a,b) > max_2(c,d) ? max_2(a,b) : max_2(c,d);
    }
    
    
  • 运行结果

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到