当前位置: 首页 > news >正文

C语言基础11天:函数

C语言基础:第11天笔记

内容提要

  • 函数

函数

函数的概论

  • 函数:实现一定功能的,独立的代码模块,我们函数一定是先定义,后使用

  • 使用函数的优势:

    • 1.我们可以通过函数提供功能给别人使用,当然我们也可以使用别人提供的函数,减少代码量
    • 2.借助函数可以减少重复性的代码
    • 3.实现结构化(模块化)程序设计思想

    关于结构化设计思想: 将大型的任务功能划分为互相独立的小型的任务模块来设计

  • 函数是C语言的基本组成单元

    C语言程序是由一个(必然是main函数)或多个函数组成

    函数的分类

    • 从函数实现的角度

      • 库函数:C语言标准库实现的并提供使用的函数,比如常见的有scanf(),printf(),strlen()…
      • 自定义函数:需要程序员自行实现,开发中大部分函数都是自定义的
    • 从函数形式的角度

      • 无参函数: 函数调用时,无需传递,可有可无返回值,

      • 有参函数: 函数调用时.需要参数传递数据,经常需要配套返回值来使用

        相关概念:

        主调函数和被调函数

        • 主调函数:主动去调用其他函数的函数

        • 被调函数: 被其他函数调用的函数

          int main//主调函数
          {
              printf("22");//被调函数
          }
          

          很多时候,尤其是对自定义函数来说,一个函数有可能是主调函数,又是被调函数

        int fun_b()
        {
        	printf("函数\n");
        	fun_b()
        }
        
        int main()
        {
        	fun_();
        }
        

函数的定义

定义

语法:

[返回类型] 函数名([形参列表])		--函数头 | 函数首部
{
    函数体语句;					--函数体,整个()包裹的内容包括返回值都属于函数体
}

函数头:

  • 返回类型: 函数返回值的类型

  • 函数名: 函数的名称,遵循标识符命名(不能以数字开头,只能包含字母,数字,下划线,建议:小写+下划线命名法,举例:set_count())

  • 形参列表:用于接收主调函数传递的数据,如果有多个参数,使用,分隔,且每一个形参都需要指明类型

  • 说明:

  • 函数的返回类型,就是返回值的类型,两个类型可以不同,但是必须能够进行转换,举例:

    double fun_a()	//返回类型:double
    {
    return 12; 		//返回值类型:int
    }
    //相当于将int类型的12赋值给了double类型的匿名变量
    double res = fun_a();
    
  • 在c语言中还可以定义无类型(即void类型)的函数,这种函数不返回函数值(没有返回值),

void test()//此时这个函数,没有返回值
{
    printf();
    
}
  • C语言中,函数的返回类型标识符是可以省略的,如果省略,默认返回int,举例:

    //写法1:main的返回类型是int类型,默认的返回值类型是0
    main()
    {
        
    }
    //写法2:等价与写法1.返回值类型是int类型,返回值是0
    int main()
    {
        return 0;//如果返回类型是int,这里return 0 不写,也是返回0
    }
    
  • 函数中返回语句的形式为return(表达式)或者return表达式,其作用是将表达式的值作为函数值返回给主调函数,其中表达式的类型应该与我们函数类型一致(也就是函数类型和返回值类型之间是支持隐式转换或者显式转换)

//写法1
int main()
{
    return(0);
    
}

//写法2
int main()
{
	return 0;//推荐    
}

如果参数列表中有多个形式参数,则它们之间要用,分隔

int avg(int x, int y, int z)
{
    ...
}

如果形参列表中有多个形参,即使他们的类型是相,在形参列表中只能逐个进行说明

int avg(int x, int y, int z)
{
    ...
}

如果形参中没有参数,我们可以不写,也可以用void来表示,举例

//写法1
int main(){..} //推荐

//写法2
int main(void){}
  • 一个完整c程序中的所有函数可以放在一个文件中,也可以放在多个文件中,举例:

    • 同一个文件:

      demo.c

      #include <stidio.h>
      
      void show()
      
      
      {
      	printf("'1'");```````````````````````````````````
      }
      
      int mian()
      {
      	show();
      }
      
    • 不同文件中:

      a.h

      void show(); // 头文件中只放函数的声明,也就是说只有函数头
      

      a.c

      #include "a.h" // 引入库函数,使用<>引入头文件;引入自定义函数,使用""引入头文件;
      void show()
      {
         printf("hello\n");
      }
      

      b.c

      #include "a.h"
      
      int main()
      {
          show();
      }
      
案例

案例1:

需求:计算1~n之间自然数的阶乘值

#include <stdio.h>
/**
* 求1~n的阶乘值
* 建议:我们设计的函数,尽量让被调函数改动较小,由主调函数去影响
*/
long fun_1(int n)
{
int i; // 循环变量
long s = 1; // 阶乘值
for (i = 1; i <= n; i++)
{
s *= i;
}
return s;// 返回结果给主调函数
}
int main(int argc,char *argv[])
{
printf("1~5的阶乘结果是:%ld\n",fun_1(5));
printf("1~10的阶乘结果是:%ld\n",fun_1(10));
    return 0;
}

型参和实参

形参(形式参数)

函数定义时指定的参数.形参是用来接受数据的,函数定义时,系统不会为形参申请内存,只有当函数调用时,系统才会为形参申请内存,主要用于存储实际参数,并且当函数返回时,系统会自动回收为形参申请的内存资源(本质上所有函数都有一个return)

实参(实际参数)
  • 函数调用时主调函数传递的数据参数(常量,符号常量,变量,表达式…只要有确定的值),实参就是传递的数据
  • 实参和形参必须类型相同, 如果不同时,按赋值规定进行类型转换
  • 在C语言中,参数传递必须遵循单项值传递实参只是将自身的值传给形参,而不是实参本身,形参的值改变不会影响实参

一个函数中可以有多个return语句,但任一个时刻只有一个return语句被执行. if(num < 0 && num >=100)

int eq(int num)
{
    if(num % 2 == 0)
    {
        printf("%d是偶数\n",num);
        return 0;
    }
    printf("%d是奇数\n",num)
        return 0;
}

被调函数返回给主调函数的结果数据(可以是变量,常量,表达式… 只要是确定值就可以)

int fun1(int a,int b)
{
  	return a + b;  
}

int fun2(int num)
{
    if(num % 2 == 0) return 0;
    return -1
}
  • 返回值类型一般情况下要和函数中return语句返回的数据类型都一直,如果不一致,以函数定时指定的返回类型为标准.也就是返回值类型和实际返回值的类型可以存在转换转换关系,一般是将返回值类型返回类型

相关文章:

  • Unity面板介绍_Project工程面板(23.1.1)
  • 解决OpenEuler系统修改句柄无效的问题
  • 《QT+PCL 第五章》点云特征-ESF
  • 基于Python/Java的医院系统切换互联网医院深度编程对接探索
  • 【个人总结】9. 通讯协议、物联网、DSP及FatFS文件系统 工作三年的嵌入式常见知识点梳理及开发技术要点(欢迎指正、补充)
  • 【大语言模型_4】源码编译vllm框架cpu版
  • Spring Data JPA 排序实战:基于 Sort 参数的实现
  • nginx ngx_http_module(9) 指令详解
  • Oracle LiveLabs实验:Oracle AI Vector Search - Basics
  • 如何通过AI优化敏捷开发中的任务管理与分配?
  • 将 Type Code 替换为 State/Strategy 模式
  • 服务器通过 ollama 运行deepseek r1
  • 《养生》(二)
  • Docker+Dify部署DeepSeek-r1本地知识库
  • Adpative Cursor Sharing引发的Oracle故障案例
  • Z-score方法是什么
  • 一周学会Flask3 Python Web开发-redirect重定向
  • 如何在 ubuntu 上使用 Clash 与 docker 开启代理拉起
  • uniapp 使用unplugin-auto-import 后, vue文件报红问题
  • QT qbytearray转qString
  • 网站优化http://www.seo668.cn/seo/橙子建站
  • 电子商务网站设计分析怎么做/重庆seo论
  • 哪里有网站开发团队/一键优化下载
  • 深圳建外贸网站/海外营销方案
  • 网站数据泄露我们应该怎么做/郑州网络运营培训
  • 斗门网站建设/seo优化的优点