☆ 函数

在前面我们已经讲过了一些简单的函数,如程序的主函数main()、标准输出函数printf()。在C语言中,大多数功能都是依靠函数来实现的。But,你知道什么是函数吗?我猜你肯定不知道。

那么今天我们来仔细的讲解一下什么是函数,函数的定义、内部函数与外部函数等相关知识。

 

☆ 函数的定义

假设有一个射击游戏程序,程序在运行过程中,要不断地发射子弹打死怪物。Biu!Biu!Biu!

假设发射子弹的代码有100行,如果说我每射击一次就要写这100行代码一次,那么可能现在的程序员哥哥都已经累死在电脑桌前了。即便没累死,这样写出来的程序也会从几十KB变成几百M,同时维护这些程序代码的程序员哥哥看到游戏连续射击时代码量的时候,也会果断的拔出菜刀砍死你。

 

那该怎么办呢?为了解决【重复编写代码】这个问题,我们可以把发射子弹这部分的代码给单独拿出来放在一个{ }中,并为这段代码起个名字。这样,每次我们需要发射子弹的时候,通过这个名字来调用发射子弹的代码块就可以了,而不是发射一次就编写一次射击动作。是不是感到很惊奇?

而这上面我们所提取并组合起来的代码块可以被看作是程序中自己定义的一个函数,玩游戏时,在需要发射子弹的地方调用这个函数就可以了。

在C语言中,定义一个函数的具体语法格式如下:

返回值类型函数名([[参数类型参数名1],[参数类型参数名2],……,[参数类型 参数n]])

{

执行语句

………

return 返回值;

}

✿ 返回值类型:用于限定函数返回值的数据类型;

✿ 函数名:表示函数的名称,该名称可以根据标识符命名规范来定义;

✿ 参数类型:用于限定调用方法时传入参数的数据类型;

✿ 参数名:用于接收调用方法时传入的数据;

✿ return关键字:用于结束函数,并返回函数指定类型的值;

✿ 返回值:被return语句返回的值,该值会返回给调用者。如果函数没有返回值,则返回值类型要声明为void,此时,函数体中的return语句可以省略不写。

在上面的语法格式中,函数中的“[[参数类型参数名1],[参数类型参数名2],...…,[参数类型 参数n]]”被称作参数列表,它主要是用来描述函数在被调用时需要接收的参数。

如果你的函数不需要接收任何参数,那么设置参数列表为空就好了,这样的函数被称为无参函数。相反地,参数列表不为空的函数就是有参函数。接下来分别讲解这两种函数。

1、无参函数

在C语言中,无参函数的定义很简单,先来看一个定义无参函数的示例代码,具体如下:

void func()

{

printf("这是我的第一个函数! ");

}

在这个示例代码中,func()函数就是一个无参函数,在定义时参数列表为空。要想执行这个函数,需要在main()函数中调用它。

案例1:

#include

void func(int x, int y)

{

int sum = x + y;

printf("x+y=%d ", sum);

}

void main()

{

func(3, 5);

}

运行结果:

 

在这个程序中,第2~6行代码定义了一个函数func(),这个函数包含两个参数,分别是x和y。当在main()函数中调用func()函数时,由于传入的参数是3和5,因此,程序打印的结果为“x+y=8”。下面通过一张图来描述func()函数的调用过程。

 

从图中可以看出,有参函数和无参函数的调用过程类似,只不过在调用有参函数时,需要传入实参,并将传入的实参赋值给形参,然后在函数体中执行x+y操作,最终将结果输出到控制台。

值得一提的是,在定义有参函数时指定的参数x和y是形式参数,简称形参,它们只在形式上存在,并不是真正存在的参数。调用函数时传入的参数(如案例中的3和5)是实际参数,简称实参,与形参相对,实参则是指实际存在的参数。

2、函数的返回值

了解了函数之后我们会发现,其实函数的返回值是指函数被调用之后,返回给调用者的值。

函数返回值的具体语法格式如下:

              return 表达式;

对于返回值为空的函数,可以直接在return语句后面加分号,具体语法格式如下:

              return;

为了让大家更好的理解如何使用return语句,接下来对案例1进行改写,使func(int x, int y)函数能够返回求和计算的结果。

案例2:

#include
int func(int x, int y) { int sum = x + y; return sum; } void main() { int sum = func(3, 5); printf("x+y=%d ", sum); }

运行结果:

 

从图中可以看出,案例1与案例2实现了同样的功能。接下来通过一个图例来演示func()函数的整个调用过程以及return语句的返回过程,如下图所示。

 

从图中可以看出,在程序运行期间,参数x和y相当于在内存中定义的两个变量。当调用func(int x,int y)函数时,传入的参数3和5分别赋值给变量x和y,并将x+y的结果通过return语句返回,整个方法的调用过程结束,变量x和y被释放。

需要注意的是,return后面表达式的类型和函数定义返回值的类型应保持一致。如果不一致,就有可能会报错。如果函数没有返回值,返回值类型要声明为void。为了保证程序的可读性和逻辑性,没有返回值的函数都应定义为void。


今天的编程知识分享就到这里,消化一下,坚持每天学会编程,下一个程序员就是你!

学C/C++不易,此路应携手前行。

欢迎关注我的编程公众號【草莓味狸猫】!

如果你想跟着小编一起学编程的话!

可以来我的C语言C++编程学习基地,【点击进入】

还有(源码,零基础教程,项目实战教学视频)!

 

【C语言编程入门】Do you know 函数?不知道了吧,我来告诉你!的更多相关文章

  1. 编程入门python之定义函数【转】

    编程入门python之定义函数 零基础学编程by学哥 2017-02-06 10:51 今天讲python函数. 输入参数求三角形或圆形或长方形的面积 先输入1个参数:形状类型 1=三角形 2=圆形 ...

  2. 【C语言编程入门笔记】C语言果然博大精深!函数还分内部和外部?

    ۞ 外部函数与内部函数 前面我们讲解了关于函数的调用都是针对同一个源文件中其他函数进行调用的,而在有些情况下,函数也可以对另外一个源文件中的函数进行调用.当一个程序由多个源文件组成时,根据函数是否能被 ...

  3. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  4. C语言编程入门之--第四章C语言基本数据类型

      导读:C语言程序中经常涉及一些数学计算,所以要熟悉其基本的数据类型.数据类型学习起来比较枯燥,不过结合之前的内存概念,以及本节的字节概念,相信数据类型也就不难理解了.本章从二进制的基本概念开始,然 ...

  5. [转] linux操作系统下c语言编程入门--基础知识

    点击阅读原文 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 1. 源程序编译        2. Makefile的编写        3. 程序库 ...

  6. C语言编程入门之--第一章初识程序

    第一章 初识程序 导读:计算机程序无时不刻的影响着人类的生活,现代社会已经离不开程序,程序的作用如此巨大,那么程序到底是什么呢?本章主要讨论程序的概念,唤起读者对程序的兴趣,同时对C语言程序与其它语言 ...

  7. C语言编程入门之--第三章编写第一个C语言程序

    第三章 编写第一个C语言程序 导读:一般学一门计算机语言的第一堂上机课(“上机”顾名思义,上了计算机),就是往屏幕输出“hello world”,本章也不例外. 1.1 Hello,World! 这一 ...

  8. Unix/Linux环境C编程入门教程(31) 数学函数带你战胜企业面试

    1.函数介绍: abs()acos()asin()atan()atan2()ceil()cos()cosh()exp()frexp()ldexp()log()log10()pow()sin()sinh ...

  9. go语言编程入门

    查看文档 首先先分享一个可以在本地就能查看文档的骚操作(linux系统) 1.打开命令行终端,输入godoc -http=:8000,如果想后台运行在后面加个& 2.然后打开浏览器,输入网址: ...

随机推荐

  1. ARM函数调用总结

    ARM架构寄存器介绍 ARM架构下处理器有7种工作模式: 1. USR模式:正常用户模式,在USR模式下进程正常执行 2. FIQ模式(Fast Interrupt Request):处理快速中断模式 ...

  2. Python基础 读取二进制文件

    问题 有二进制文件中保存了 20 亿个 2 Bytes 的数,需将其读出,每 20000 个数作图,拟合后输出结果. 解决 # -*- coding: utf-8 -*- ""&q ...

  3. 论文阅读:Relation Structure-Aware Heterogeneous Information Network Embedding

    Relation Structure-Aware Heterogeneous Information Network Embedding(RHINE) (AAAI 2019) 本文结构 (1) 解决问 ...

  4. get、post请求方式在jmeter中使用步骤

    jmeter:性能测试工具,压测 一.jmeter工具测试接口时使用步骤: 1.测试计划右键--添加--Threads(Users)--线程组(线程数就是并发数) 2.线程组右键--Sampler-- ...

  5. 刀哥之指纹识别biometrics

    指纹识别 - 生物识别 简介 iPhone 5S 开始支持 iOS 8.0 开放了 Touch ID 的接口 代码准备 - (void)touchesBegan:(NSSet *)touches wi ...

  6. 简单地 Makefile 书写

    注意事项 每个标签分支前都不能用空格,必须用tab 标签外调用bash命令用 $(shell -),标签内可以正常使用 标签后可以指定其他标签,执行顺序是先执行其他标签,而后在执行自己 比如 all: ...

  7. Kubernetes中的存储(六)

    一.ConfigMap 1,介绍 ConfigMap 功能在 Kuberbetes 1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们 ...

  8. Centos6.5 离线 Openssh 升级

    目录 OpenSSH 升级 一.基于 Dropbear 设置备用 ssh 服务器 二. Openssh 更新 2.1 ssh配置 备份 2.2 openssh 升级 Openssl 升级(由于Open ...

  9. js-正则表达式的初步应用(一)

    一.正则表达式是使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式.注:搜索模式也可用于文本替换 例子1 输出结果  注:(我为了方便在控制台输出,所以结果如下) 例子2 输出结果 上面 ...

  10. Elasticsearch安装、原理学习总结

    ElasticSearch ElasticSearch概念 Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎. 什么是Elastic Stack Elastic Sta ...