C语言之函数

目录

main函数和库函数

什么是函数

函数定义

函数头(function header)

1.返回类型(return type)

2.函数名(function name)

3.形参声明(parameter type list)

函数体(function body)

函数调用

求三个数中的最大数

将函数的返回值作为参数传递给函数

 调用其他函数

值传递


程序由多个零件组合而成,而函数就是这种“零件”的一个较小单位。接下来我们来学习函数的基本知识。


main函数和库函数

截至目前为止,我们一直都在的程序格式如下:

#include<stdio.h>int main()
{/*………………*/return 0;
}

蓝底字部分称为main函数,在C语言中是必不可少的,在程序执行时,会执行main函数的主体部分。

main函数中使用了printf、scanf、putchar等众多函数,由C语言提供的众多函数称为库函数


什么是函数

所谓函数,来源于数学术语函数(function),具有功能、职责的作用。所以每一个函数,就相当于完成任务的一个工具。

我们可以自己来创建各种函数,这也是我们必须学会的。

printf函数和scanf函数等创建好的函数,即使不知道内容,只要了解其使用方法,也可以轻松使用,就像是一个魔法盒一样。

要像精通这个魔法盒一样的函数,需要我们站在函数创建者和使用者双方的立场上,进行两种学习

函数的创建方法——函数定义

函数的使用方法——函数调用


函数定义

我们先来学习函数的创建方法,定义一个max2的函数

#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}

这个函数定义有多个部分构成:

函数头(function header)

该部分表示函数的名称和格式。实际上称作函数的脸更合适。

1.返回类型(return type)

函数返回的值——返回值(return value)的类型。该函数的情况下,返回的两个的是两个int型数值最大的一个,其类型是int型。

2.函数名(function name)

函数的名称,从其他零件调用函数时,使用函数名。

3.形参声明(parameter type list)

小括号扩起来的部分,适用于接收辅助性提示的变量——形式参数的声明,使用多个参数时用逗号隔开。

函数体(function body)

函数体是复合语句。仅在某个函数中使用的变量,原则上应在该函数中声明和使用。但要注意不能声明和形参同名的变量,否则会发生变量名的冲突。


函数调用

我们已经知道了函数的创建方法(函数定义),接下来让我们学习函数的使用方法(函数调用)。

让我们先创建一个求最大值的函数并且调用它:

#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}
int main()
{int n1, n2;puts("请输入两个整数:");printf("整数1:");    scanf("%d", &n1);printf("整数2:");    scanf("%d", &n2);printf("较大的整数是%d\n", max2 (n1, n2));}

该程序定义了两个函数max2和main,程序首先执行的是main函数(虽然max2函数定义在main函数之前)。使用函数的过程称为调用函数。

我们来用图具体说明在调用函数,程序时怎么执行的:

我们可以说:函数max2,给你两个值,哪个值最大?

 函数调用的形式是在函数名后面加上小括号,这个小括号称为函数调用运算符,使用函数调用运算符的表达式称为函数调用表达式

1.函数调用运算符括起来的是实参,实参可以有多个,需要用逗号隔开。

2.进行函数调用后,程序的流程将会一下调到该函数处,main函数立刻停止,开始执行max2函数。

3.在被调用的一方,会生成用于形参的变量(在函数定义时形参并不是实际存在的),并赋予实参的值。

4.形参完成初始化后,将会执行函数体,程序在执行时遇到return语句或者是循环体最后的 } ,就会从该函数跳转到调用函数。return后面的表达式(比如说return b)在回到调用函数main函数时,可以看为给它带的一个小礼物。

返回值是通过对函数调用表达式进行判定而得到的。

比如a=5,b=6.6,由于函数返回类型时int型,所以得到的判定结果就是int 6

函数调用运算符
x(arg)                                   向函数传递实参arg并调用,如果返回值类型不是void,则生成函数x返回的值。

关于返回值类型void,我们会在下一节中学到。

函数调用时传递的只是参数的值,因此使用的实参既可以是变量也可以是常量。例如:

max (n1, 5)

 另外,实参和形参是两个不同的东西,因此不用担心它们名字相同。

接下来我们看下return语句的结构:

函数返回的是表达式的值,不能有两个。

接下来我们来看看关于max2函数的其他定义的方法:

/*第一种*/
int max2(int a, int b)
{int max;if(a > b)max = a;elsemax = b;return max;
}

/*第二种*/
int max2(int a, int b)
{int max = a;if(b > max)max = b;return max;}

/*第三种*/
int max2(int a, int b)
{return (a > b) ?a : b;//使用了条件运算符
}

在第一种函数和第二种函数,都使用了变量max,像这样只在某个函数中使用的变量,需要在该函数中进行声明,但是不能与形参的名字重复,否则会发生变量名的冲突。


求三个数中的最大数

我们学习完函数的定义与声明后,应该初步会编写一些简单的程序了,接下来我们来编写求三个数中的最大数的值

#include<stdio.h>int max3(int a, int b, int c)
{int max = a;if(b > max) max = b;if(c > max) max = c;return max;
}int main()
{int n1, n2, n3;printf("整数1:"); scanf("%d", &n1);printf("整数2:"); scanf("%d", &n2);printf("整数3:"); scanf("%d", &n3);printf("最大值是%d。\n", max3 (n1, n2, n3 ));return 0;
}

 

将函数的返回值作为参数传递给函数

#include<stdio.h>/*返回x的平方*/
int sqr(int x)
{return x * x;
}/*返回x和y的值*/
int diff(int a, int b)
{return (a > b) ?a - b:b - a;
}int main()
{int x, y;puts("请输入俩个整数:");printf("整数1:"); scanf("%d", &x);printf("整数2:"); scanf("%d", &y);printf("两个整数的平方差是%d", diff(sqr(x), sqr(y)));return 0;
}

1.该程序中先调用函数sqr,把实参的值传递给x,进行平方后得到返回值。

2.再把返回值作为实参传递给函数diff中的形参a和b,对该表达式进行判断后得到返回值

3.最后main函数直接将返回值传递给printf函数并显示。


 调用其他函数

截止到目前为止,我们都是在main函数中调用库函数或我们自己创建的函数,现在我们来学习在自己创建的函数调用其他函数。

#include<stdio.h>/*返回较大值*/
int max2(int a, int b)
{return (a > b) ? a : b;
}/*返回四个整数中的最大值*/
int max4(int a, int b, int c, int d)
{return max2(max2(a, b), max2(c, d));
}int main()
{int n1, n2, n3, n4;printf("整数1:"); scanf("%d", &n1);printf("整数2:"); scanf("%d", &n2);printf("整数3:"); scanf("%d", &n3);printf("整数4:"); scanf("%d", &n4);printf("最大的整数是%d", max4(n1, n2, n3, n4));return 0;
}

我们来拆解分析下:

1.首先在main函数中调用max4函数,main函数立刻停止,把实参赋值给max4中的形参。

2.然后在max4函数中调用两次max2函数,第一求a和b中较大数、c和d中较大数第二次调用     比较它们二者比较后得出的较大数。

3.最后main函数把返回值传递给printf函数并显示。

 通过这个案例,我们可以认为函数就是一个程序的零件,例如想实现显示功能时,就调用printf函数这个零件。在制作零件的时候,如果有其他方便的零件,我们也可以大量使用。


值传递

我们来创建一个计算幂的函数。

#include<stdio.h>/*返回x的n次幂*/
int power(double x, int n)
{int i;double tmp = 1.0;for(i = 1; i <= n; i++){tmp *= x;}return tmp;
}int main()
{double a;int b;printf("求a的b次幂。\n");printf("实数1:"); scanf("%lf", &a);printf("整数2:"); scanf("%d", &b);printf("%.2f的%d次幂是%.2f。\n", a, b, power(a, b));return 0;
}

形参x被赋上实参a的值,形参n被赋上b的值,像这样通过值来进行参数传递的机制称为值传递

注意

函数间参数的传递称是通过值传递进行的。

形参x是实参a的副本,形参n是实参b的副本,所以在调用一方的函数power,即使改变所接受的形参的值,调用的实参也不会受影响。

到此为止,我们已经学习了函数一部分的基础知识,关于函数部分虽然有些抽象,但不要畏难,多看几遍书和视频讲解,相信大家都能乘风破浪。

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

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

相关文章

通过静态HTTP实现负载均衡

在当今的互联网环境中&#xff0c;随着用户数量的不断增加和业务需求的不断扩大&#xff0c;单台服务器往往无法承受所有的访问压力。为了确保网站的可用性和性能&#xff0c;负载均衡成为了一种常见的解决方案。本文将探讨如何通过静态HTTP实现负载均衡&#xff0c;以提升网站…

认识系统服务daemons

什么是daemon与服务&#xff08;service) 常驻内存的是进程&#xff0c;可以提供一些系统或网络功能&#xff0c;这就是服务。实现service的程序称为daemon。也就是说要想提供某种服务&#xff0c;daemon实在后台运行的。 daemon的分类&#xff1a; 1&#xff09;可独立启动…

【Angular开发】2023年促进您开发的最佳Angular库

如果你是一名开发人员&#xff0c;你可以理解平台的重要性&#xff0c;它可以加快开发过程&#xff0c;显著减少编码时间和工作量。 根据StackOverflow开发者2021年的调查&#xff0c;Angular是其中一个令人惊叹的平台&#xff0c;它一直赢得人们的喜爱&#xff0c;并获得了全…

【vtkWidgetRepresentation】第六期 vtkFinitePlaneRepresentation

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享VTK中的平面Plane表示方法&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; …

机器人阻抗控制直观(图示理解)与控制框架/架构

在刚性碰撞下&#xff0c;机器人的阻抗调节可以使其更好地适应外部环境。具体来说&#xff0c;通过建立力与位移之间的关系&#xff0c;并改变阻抗参数&#xff0c;可以控制机器人对外部力的响应。 在具体实现上&#xff0c;可以采用基于位置的阻抗控制或基于力的阻抗控制。基于…

【Java 基础】26 枚举

文章目录 1. 什么是枚举2. 定义3. 使用1&#xff09;常量2&#xff09;遍历3&#xff09;switch 4. 属性和方法1&#xff09;属性2&#xff09;方法 5. 实现原理6. 使用场景总结 1. 什么是枚举 枚举是列出某些有穷序列集的所有成员的程序&#xff0c;或者是一种特定类型对象的计…

Windows下使用CMD修改本地IP

在网络适配器界面查看当前网线连接的哪个网口&#xff0c;我当前连的是 以太网 这个名字的&#xff1a; 在windows下使用管理员权限打开CMD命令工具&#xff0c;输入如下命令(如我想本地ip改成192.168.2.4)&#xff1a; netsh interface ip set address "以太网" st…

LeetCode Hot100 78.子集

题目&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 方法&#xff1a;灵神 选 or 不选 class Solution {private final List&…

spring 的概述和入门

​ 我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; …

信号量的使用和注意事项

大家好&#xff0c;今天给大家介绍信号量的使用和注意事项&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 信号灯(信号量)集 POSIX 线程中的同步用的是无名信号量 进程间的同步使…

乔拓云平台:微信小程序开发的全新视角与高效路径

随着微信小程序的日益普及&#xff0c;越来越多的人开始关注如何开发自己的小程序。对于没有开发经验的人来说&#xff0c;借助第三方平台如乔拓云&#xff0c;可以轻松实现小程序的开发。本文将介绍微信小程序开发需要学习的东西&#xff0c;并探讨如何借助乔拓云平台进行无经…

基于深度学习的钢铁缺陷检测系统(含UI界面,Python代码,数据集、yolov8)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

【改进YOLOv8】融合可变形大核注意力D-LKA-Attention的油气管道设备泄露检测系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着油气管道设备的广泛应用&#xff0c;油气泄露问题已经成为一个严重的环境和安全隐患。油气泄露不仅会造成环境污染&#xff0c;还可能引发火灾、爆炸等严重事…

视频剪辑高手揭秘:如何批量减少时长并调整播放速度,提升视频效果

随着社交媒体的兴起&#xff0c;视频制作的需求越来越大。然而往往视频文件存在一些问题&#xff0c;例如时长过长&#xff0c;或者要调整播放速度以更好地传达信息。这些问题不仅影响了视频的观看体验&#xff0c;也可能导致视频难以在社交媒体上获得广泛的传播。那么&#xf…

文件夹重命名:提升工作效率,使用关键词替换法重命名文件夹

在日常生活和工作中&#xff0c;经常要处理大量的文件夹和文件。有时候&#xff0c;为了更好地管理和查找文件&#xff0c;要给文件夹重新命名。但是&#xff0c;重命名文件夹并不是一件容易的事情&#xff0c;尤其是当文件夹数量众多时。一个一个修改耗费极大的时间和精力&…

后端返回base64文件前端如何下载

1.后端返回base64格式文件 2.前端代码 <style lang"less" scoped> import "./style/common.less";.table-div-a {color: #409EFF;text-decoration: underline;cursor: pointer; } </style><template><div class"template-con…

一文搞懂什么是Hadoop

Hadoop概念 什么是Hadoop Hadoop是一个由Apache基金会所开发的用于解决海量数据的存储及分析计算问题的分布式系统基础架构。 广义上来说&#xff0c;Hadoop通常指一个跟广泛的概念——Hadoop生态圈。 以下是hadoop生态圈中的技术&#xff1a; Hadoop优势 hadoop组成 HDFS…

一个不错的文章伪原创系统程序源码

一款文章伪原创系统程序源码免费分享&#xff0c;程序是站长原创的。 一共花了站长几天时间写的这个文章伪原创平台&#xff0c;程序无需数据库。 程序前端采用BootStrap框架搭建&#xff0c;后端采用PHP原生书写。 前端伪原创采用Ajax无刷新提交&#xff0c;Ajax转换到词库…

【爬取二手车并将数据保存在数据库中】

爬取二手车并将数据保存在数据库中 查看网页结构分析爬取步骤解密加密信息将密文解密代码&#xff1a; 进行爬取&#xff1a;爬取函数写入解密文件函数和获取城市函数解密文件&#xff0c;返回正确字符串函数保存到数据库 运行结果 查看网页结构分析爬取步骤 可以看出网页使用…

C 语言 变量

变量初始值 全局变量&#xff1a;初始值是 0 局部变量&#xff1a;初始值是 随机的 类型限定符 通常不需要显式使用 register 关键字来优化变量的存储和访问。 关键字 _Complex和_Imaginary分别用于表示复数和虚数&#xff08;二者皆是数学概念&#xff09; 变量的声明和定义 c…