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;
}

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

375633d555a54dcea49c7bd006eff575.png

函数头(function header)

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

1.返回类型(return type)

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

2.函数名(function name)

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

3.形参声明(parameter type list)

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

函数体(function body)

bc3175445cd240e1bf4b95e1ffe84076.png

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

 


函数调用

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

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

#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函数之前)。使用函数的过程称为函数调用。

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

ae69248c3b15430a80e8a490ca3b06d1.png

我们可以说:函数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语句的结构:

dd99f7174815458b80bf9bb2300da97b.png

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

接下来我们来看看关于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,即使改变所接受的形参的值,调用的实参也不会受影响。

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

 

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

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

相关文章

使用Nacos作为配置中心

Nacos配置中心简介 首先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个微服务架构下&#xff0c;配置文件会随着微服务的增多变的越来越多&#xff0c;而且分散 在各个微服务中&#xff0c;不好统一配置和管理。配置文件无法区分环境…

Day18JAVA

异常 异常:异常就是代表程序出现的问题 误区:不是让我们以后不出现异常,而是程序出现了异常之后,该如何处理 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class Test {public static void main(String[] args) throw…

go-libp2p-example-chat学习

1.案例下载 https://github.com/libp2p/go-libp2p/tree/master/examples 2.chat案例 这段代码是一个简单的基于libp2p的P2P聊天应用程序的示例。它允许两个节点通过P2P连接进行聊天。前提是&#xff1a; 两者都有私有IP地址&#xff08;同一网络&#xff09;。至少其中一个…

基于ssm校园美食交流系统论文

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行性 10 3.1.3 操作可行性 10…

python:五种算法(GA、OOA、DBO、SSA、PSO)求解23个测试函数(python代码)

一、五种算法简介 1、遗传算法GA 2、鱼鹰优化算法OOA 3、蜣螂优化算法DBO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

管理类联考——写作——真题篇——按大小作文分类——小作文

文章目录 56.论证有效性分析&#xff1a;分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该论证的有效性进行分析和评论。方法20232022202120202019201820172016201520142013 56.论证有效性分析&#xff1a;分析下述论…

java jvm堆内存分析工具MAT(导出运行中jvm堆内存、加载导出文件分析)

下载地址&#xff1a;https://eclipse.dev/mat/downloads.php 历史版本&#xff1a;https://eclipse.dev/mat/previousReleases.php jdk1.8这些老版本jdk需要使用历史版本的&#xff0c;我的是1.8&#xff0c;用的1.10的mat 我下载的地址&#xff1a;https://www.eclipse.org/d…

微服务黑马头条(简略笔记)

Linux中nacos的拉取安装 拉取naocs镜像&#xff1a;docker pull nacos/nacos-server:1.2.0创建容器&#xff1a;docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0访问地址&#xff1a;http://192.168.200.130:8848/n…

聚观早报 |一加12首销;华为智能手表释放科技温暖

【聚观365】12月12日消息 一加12首销 华为智能手表释放科技温暖 卡尔动力获地平线战略投资 英伟达希望在越南建立基地 努比亚Z60 Ultra影像规格揭晓 一加12首销 现在有最新消息&#xff0c;近日一加12该机已于昨日开售&#xff0c;售价4299元起。 外观方面&#xff0c;全…

《地理信息系统原理》笔记/期末复习资料(12. 地理信息工程)

目录 12. 地理信息工程 12.1. 地理信息系统工程的概念 12.2. 地理信息系统工程建设过程 12.2.1. 应用型地理信息系统设计步骤和方法 12.2.2. 需求分析 12.2.3. 系统设计 12.2.4. 系统开发与实施 12.2.5. 系统的评价和维护 12.3. GIS标准 12.4. 习题 12. 地理信息工程…

Linux——基本指令(二)

​ 个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 写在前面&#xff1a; 紧接上一章&#xff0c;我们在理解接下来的命令之前&#xff0c…

m_map导入本地地形数据

m_map绘制地形图时&#xff0c;虽然自带有1的地形图以及从NOAA下载的1分的地形图&#xff08;详见&#xff1a;Matlab下地形图绘图包m_map安装与使用&#xff09;&#xff0c;但有时需要对地形图分辨率的要求更高&#xff0c;便无法满足。 此时&#xff0c;需要导入本地地形数…