C语言基础:第10天笔记

内容提要

  • 函数

    • 函数的概述

    • 函数的分类

    • 函数的定义

    • 形参和实参

    • 函数的返回值

函数

函数的概述

  • 函数:实现一定功能的,独立的代码模块,函数是c程序的核心构成模块,可以说c程序就是由众多的函数组成,对于函数的使用,一定是先定义,后使用。

  • 使用函数的优势:

    ①可以通过函数提供给别人使用,也可以使用别人提供的函数,减少代码量。

    ②借助函数可以减少重复性的的代码。

    ③实现结构化(模块化)程序设计思想

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

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

    C语言程序是由一个或多个函数组成

函数的分类

  • 从函数实现的角度:

    • 库函数:C语言标准库实现的并提供使用的函数,比如:scanf() printf() fgets() fputs() strlen()

    • 自定义函数:需要程序员自行实现,开发中大部分函数都是自定义函数

  • 从函数形式的角度:

    • 无参函数:函数调用时,无需传递,可有可无返回值,举例: test1();

    • 有参函数:函数调用时,需要参数传递数据,经常需要配套返回值来使用,举例:printf("%d\n",12);

  • 从函数调用的角度:

    • 主调函数:主动去调用其他函数的函数。(main函数只能作为主调函数)

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

      举例:

       //主调函数int main(){//被调函数printf("hello world\n");}

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

       int fun_b(){printf("hello\n");}​//主调函数int fun_a(){printf("world\n");//被调函数fun_b();}​int main(){//被调函数fun_a();}

      以上案例中,fun_b()来说是主调函数,同时对于main()函数来说,它又是被调函数。

函数的定义

定义

语法:

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

函数头:

  • 返回类型:函数返回值的类型,(返回值是被调函数的主调函数)

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

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

小贴士:

形参列表(被调函数):主调函数给被调函数传递数据,主调函数 → 被调函数

返回类型(被调函数):被调函数给主调函数返回数据,被调函数 →主调函数

说明:

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

     double fun_a()   //函数的返回类型是double{return 12;   //函数返回值是int}

    以上代码可以理解为:将int类型的12赋值给一个double类型的匿名变量(int → double),此时属于隐式转换。

     int fun_a()   //函数的返回类型是double{return 12.5;   //函数返回值是int}

    案例:

     ​
  • 在C语言中还可以定义无类型(void类型)的函数,这种函数不返回函数值(没有函数值),只是完成某种功能,举例:

     void test()    //此时这个函数没有返回值,也就是它的返回值是,return;{printf("hello\n");}​//下面等价于上面void test(){return;  //一般,这个return是省略不写的}
  • 在C语言中,函数的返回类型是可以省略的,如果省略,默认返回int,举例:

     //写法1  main的返回类型是int类型,默认的返回值是0,等价于写法2main(){...}​//写法2:main的返回类型是int类型,默认的返回值是0int main(){return 0;  // 0:逻辑真, -1:逻辑假   支持非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,y,z)
    {...
    }
  • 如果形参列表中没有参数,我们可以不写,也可以用void标识,举例:

    //写法1
    int main()
    {...
    }//写法2
    int main(void)
    {...
    }
案例

案例1

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

  • 代码:

    注意:这里计算结果为0是因为数据太大,超过int存储范围,数据丢失

案例2

  • 需求:计算一个圆台两个面的面积之和。

  • 方案1:自定义一个函数,直接计算两个圆的面积和

  • 方案2:自定义一个函数,只计算一个圆的面积

  • 代码:

    /*************************************************************************> File Name:    demo02.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 14时26分54秒************************************************************************/#include <stdio.h>
    #include <math.h>
    #define PI 3.1415926// 对库函数
    extern double pow(double x,double y);/*** 定义一个函数,根据半径计算面积* @param r :半径* @return 面积*/
    double cicle_area(double r)
    {return PI * pow(r,2.0);//编译的时候,需要在gcc后面加-lm
    }int main(int argc,char *argv[])
    {// 定义两个圆半径和两个园面积double r1,r2,area1,area2;printf("请输入两个圆的半径\n");scanf("%lf,%lf",&r1,&r2);//计算面积area1 = cicle_area(r1);area2 = cicle_area(r2);//输出printf("一个园台两个面面积之和为:%.2f\n",area1 + area2);return 0;
    }
    

形参和实参

形参(形式参数)

函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当函数调用时,系统才会为形参申请内存,主要用于存储实际参数,并且当函数同时(执行return),系统会自动回收为形参申请的内存资源。

案例

  • 需求:判断奇偶数

  • 代码:

/**
* 方式1
*/
void fun(int n)
{if(n % 2 == 0){printf("%d是偶数\n",n);}else{printf("%d是奇数\n",n);}
}/**
* 方式2 推荐
*/
void fun(int n)
{if(n % 2 == 0){printf("%d是偶数\n",n);return;//return之后代码不执行}printf("%d是奇数\n",n);
}/**
* 方式3 推荐
*/
int fun(int n)
{if(n % 2 == 0){printf("%d是偶数\n",n);return -1;//return之后代码不执行}printf("%d是奇数\n",n);return 0;
}
实参(实际参数)
定义
  • 函数调用时主调函数传递的数据参数(字面量、符号常量、表达式...,是要是确定的值),实参就是传递的数据。

  • 实参和形参必须类型相同,如果不同时,按赋值规定进行类型转换,比如隐式转换。

  • 在C语言中,实参传递必须遵循单向传递(通过实参给形参赋值),实参只是将自身的值传递给了形参,而不是实参本身,形参的值的改变不会影响实参。

    int fun(int n)
    {printf("%d\n",n);
    }int main()
    {int a = 10; // a = 10fun(a); // a是实参,数据10,实参是变量a = 20; //a = 20fun(12);//字面量12就是实参fun(a + 12); //数据量是22 实参是表达式
    }
  • 实参与形参在内存中占据不同的内存空间。

    double fabs(double a)
    {return a < 0 ? -a : a;
    }int main()
    {int x = 12,y = -12;int x1 = (int)fabs(x);  //12int y1 = (int)fabs(y);  //12
    }
案例

案例1:

  • 需求:输入4个整数,要求用一个函数求出最大数

  • 代码:

    /*************************************************************************> File Name:    demo03.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 15时25分32秒************************************************************************/#include <stdio.h>/*** 定义一个函数,求两个数最大数* @param x,y* @return 最大数*/
    int max(int x, int y)
    {return x > y ? x : y;
    }int main(int argc,char *argv[])
    {int a,b,c,d,max1,max2,max3;printf("输入4个数\n");scanf("%d%d%d%d",&a,&b,&c,&d);//求abmax1 = max(a,b);//求abcmax2 = max(max1,c);//求abcdmax3 = max(max2,d);printf("%d,%d,%d,%d中最大%d\n",a,b,c,d,max3);return 0;
    }
    

函数的返回值

  • 若不需要返回值,函数可以没有return语句。

    //如果返回类型是void,return可以省略
    void fun1
    {}//return 可以省略,默认 0
    int fun2()
    {}
    //return 可以省略,默认 0
    fun3()
    {}
  • 一个函数中可以有多个return语句,但任一时刻只有一个return语句被执行

    int eq(int num)
    {if(num % 2 == 0){printf("%d\n",num);return 0;}printf("%d\n",num);return 0;
    }
  • 返回值类型一般情况下要和函数中return语句返回的数据类型一样,如果不一致,以函数定义时指定的返回值类型为标准。

案例

需求:输入两个整数,要求用一个函数求最大数

  • 案例1:

    /*************************************************************************> File Name:    demo04.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 16时01分54秒************************************************************************/#include <stdio.h>/*** 定一个函数* @param x,y* @return max*/
    int get_max(int x, int y)
    {if (x > y) return x;return y;
    }int main(int argc,char *argv[])
    {int a,b,max;printf("请输入\n");scanf("%d%d",&a,&b);max = get_max(a,b);printf("%d,%d中最大数是%d\n",a,b,max);return 0;
    }
    

  • 案例2

    /*************************************************************************> File Name:    demo05.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 16时01分54秒************************************************************************/#include <stdio.h>/*** 定一个函数* @param x,y* @return max*/
    double get_max(int x, int y)
    {if (x > y) return x;return y;
    }int main(int argc,char *argv[])
    {int a,b,max;printf("请输入\n");scanf("%d%d",&a,&b);max = (int)get_max(a,b);printf("%d,%d中最大数是%d\n",a,b,max);return 0;
    }
    

  • 案例3:

    /*************************************************************************> File Name:    demo06.c> Author:       > Description:  > Created Time: 2025年03月14日 星期五 16时01分54秒************************************************************************/#include <stdio.h>/*** 定一个函数* @param x,y* @return max*/
    double get_max(int x, int y)
    {double z;z = x > y ? x : y;return (int)z;
    }int main(int argc,char *argv[])
    {int a,b,max;printf("请输入\n");scanf("%d%d",&a,&b);max = get_max(a,b);printf("%d,%d中最大数是%d\n",a,b,max);return 0;
    }
    

    运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集成开发环境革新:IntelliJ IDEA与Cursor AI的智能演进

集成开发环境革新&#xff1a;IntelliJ IDEA 与 Cursor AI 的智能演进 集成开发环境&#xff08;IDE&#xff09; 是软件开发者必不可少的工具。一个优秀的 IDE 不仅能够帮助编写和调试代码&#xff0c;还能集成版本控制和代码优化等多种功能。如今&#xff0c;随着人工智能&a…

【Django】教程-1-安装+创建项目+目录结构介绍

欢迎关注我&#xff01;后续会更新django教程。一周2-3更&#xff0c;欢迎跟进&#xff0c;本周会更新第一个Demo的单独一个模块的增删改查【Django】教程-4-一个增删改查的Demo【Django】教程-2-前端-目录结构介绍【Django】教程-3-数据库相关介绍 1.项目创建 1.1 安装 Djan…

智能仪表板DevExpress Dashboard v24.2新版亮点:支持.NET 9

使用DevExpress BI Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设备的决策…

北斗导航 | 改进最小二乘残差法的接收机自主完好性监测算法原理,公式,应用,研究综述,matlab代码

改进最小二乘残差法的接收机自主完好性监测算法研究 摘要 本文针对传统最小二乘残差RAIM算法在复杂环境下检测性能不足的问题,提出了一种基于加权抗差估计的改进算法。通过引入IGGⅢ权函数构建抗差最小二乘模型,结合滑动窗口方差估计和自适应阈值调整机制,显著提升了算法对…

24、web前端开发之CSS3(一)

CSS3详细讲义 目录 CSS3简介CSS3核心特性选择器盒模型背景与边框文本样式颜色与透明度过渡与动画变换弹性盒布局网格布局媒体查询多列布局字体与排版装饰与效果性能优化新特性与兼容性CSS3实践示例总结 一、CSS3简介 CSS3&#xff08;Cascading Style Sheets, Level 3&#…

【Git “reset“ 命令详解】

以下是关于 git reset 命令的完整博客文章内容&#xff1a; 本章目录: 1. 命令简介主要用途&#xff1a; 2. 命令的基本语法和用法语法格式&#xff1a;使用场景&#xff1a; 3. 命令的常用选项及参数选项示例&#xff1a;1. 使用 --soft 进行软重置2. 使用 --mixed 进行混合重…

STM32 IIC通信

目录 IIC简介硬件电路连接I2C时序基本单元IIC完整数据帧MPU6050封装硬件IIC内部电路 IIC简介 IIC&#xff08;Inter-Integrated Circuit&#xff09;是 IIC Bus 简称&#xff0c;中文叫集成电路总线。它是一种串行通信总线&#xff0c;使用多主从架构&#xff0c;由飞利浦公司…

深入解析 TypeScript 核心配置文件 tsconfig.json

什么是 tsconfig.json&#xff1f; tsconfig.json 是 TypeScript 项目的中枢神经系统&#xff0c;它是 TypeScript 编译器的配置文件&#xff0c;决定了整个项目的编译规则、模块解析方式和类型检查策略。这个 JSON 文件通常位于项目根目录&#xff0c;是 TypeScript 工程化开…

debug 笔记:llama 3.2 部署bug 之cutlassF: no kernel found to launch!

1 问题描述 按照官方的写法 import torch from transformers import pipeline import os os.environ["HF_TOKEN"] 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 model_id "meta-llama/Llama-3.2-3B"pipe pipeline("text-generation", modelmode…

使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第五讲)

在上一讲我们讲解了按键回调函数的自定义函数的用法&#xff0c;这一讲继续讲解回调函数的另一种用法。 首先我们将上一讲做好的按键名称以及自定义回调事件中的按键名称修改&#xff0c;改为默认模式为“open”当点击按键时进入回调函数将按键名称改为“close”&#xff0c;具…

Hyperliquid 遇袭「拔网线」、Polymarket 遭治理攻击「不作为」,从双平台危机看去中心化治理的进化阵痛

作者&#xff1a;Techub 热点速递 撰文&#xff1a;Glendon&#xff0c;Techub News 继 3 月 12 日「Hyperliquid 50 倍杠杆巨鲸」引发的 Hyperliquid 清算事件之后&#xff0c;3 月 26 日 晚间&#xff0c;Hyperliquid 再次遭遇了一场针对其流动性和治理模式的「闪电狙击」。…

交换机与路由器的区别:深入解析

在构建和维护现代计算机网络的过程中&#xff0c;交换机和路由器无疑是两种不可或缺的设备。尽管它们都在数据的传输和转发中扮演着重要角色&#xff0c;但各自的工作原理、应用场景和功能特性却大相径庭。本文将从多个角度&#xff0c;结合最新的技术发展和实际应用&#xff0…

自顶向下学习K8S--部署Agones

本文在本人博客&#xff0c;原文地址&#xff1a;http://viogami.tech/index.php/blog/346/ 我是gopher&#xff0c;离不开云原生&#xff0c;自然也逃不了理解docker和K8S这俩。今天抽空想玩下agones&#xff0c;进而对K8S有实践性的理解。 学一个新事物从底层理论学肯定是最…

蓝桥杯省模拟赛 阶乘求值

问题描述 给定 n&#xff0c;求 n! 除以 1000000007的余数。 其中 n! 表示 n 的阶乘&#xff0c;值为从 1 连乘到 n 的积&#xff0c;即 n!123…n。 输入格式 输入一行包含一个整数 n。 输出格式 输出一行&#xff0c;包含一个整数&#xff0c;表示答案。 样例输入 3样…

如何在Webpack中配置别名路径?

如何在Webpack中配置别名路径&#xff1f; 文章目录 如何在Webpack中配置别名路径&#xff1f;1. 引言2. 配置别名路径的基本原理3. 如何配置别名路径3.1 基本配置3.2 结合Babel与TypeScript3.2.1 Babel配置3.2.2 TypeScript配置 3.3 适用场景与最佳实践 4. 调试与常见问题4.1 …

协作机械臂需要加安全墙吗? 安全墙 光栅 干涉区

安全墙是什么 文章目录 安全墙是什么简介1. 物理安全墙1.1 定义&#xff1a;1.2 作用机制&#xff1a;1.3 应用场景&#xff1a; 2. 虚拟安全墙2.2 定义&#xff1a;2.3 作用机制&#xff1a;2.3 应用场景&#xff1a; 3. 安全毛毯3.1 工作原理&#xff1a;3.2 特点3.3 应用场景…

Promise怎么使用,以及它解决了什么问题?

什么是 Promise&#xff1f; Promise 是一种用于处理异步操作的 JavaScript 对象&#xff0c;它代表了一个可能还未完成但将来会完成的操作的结果。Promise 的目的是解决回调函数&#xff08;callback&#xff09;带来的问题&#xff0c;比如回调地狱&#xff08;callback hel…

光谱范围与颜色感知的关系

光谱范围与颜色感知是光学、生理学及技术应用交叉的核心课题&#xff0c;两者通过波长分布、人眼响应及技术处理共同决定人类对色彩的认知。以下是其关系的系统解析&#xff1a; ‌1.基础原理&#xff1a;光谱范围与可见光‌ ‌光谱范围定义‌&#xff1a; 电磁波谱中能被特定…

如何让DeepSeek-R1在内网稳定运行并实现随时随地远程在线调用

前言&#xff1a;最近&#xff0c;国产AI圈里的新星——Deepseek&#xff0c;简直是火到不行。但是&#xff0c;你是不是已经对那些千篇一律的手机APP和网页版体验感到腻味了&#xff1f;别急&#xff0c;今天就带你解锁一个超炫的操作&#xff1a;在你的Windows电脑上本地部署…

leetcode33.搜索旋转排序数组

思路源于 【小白都能听懂的算法课】【力扣】【Leetcode33】搜索旋转排序数组 | 二分查找 | 数组 主要是数组旋转后分为左右两个升序区间 &#xff0c;如果mid落在左区间并且目标大小也在left-mid中&#xff0c;那么right右缩 class Solution {public int search(int[] nums, i…