大话C语言:第18篇 函数

news2024/11/18 3:50:10

1 函数概述

        函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。函数是一种可重用的代码块,用于执行特定任务或完成特定功能。函数主要作用是对具备相同逻辑的代码进行封装,提高代码的编写效率,实现对代码的重用。例如,实现一段文件说明函数:

#include <stdio.h>

// 定义函数
void func() {
    printf("                            _ooOoo_  \n");
    printf("                           o8888888o  \n");
    printf("                           88  .  88  \n");
    printf("                           (| -_- |)  \n");
    printf("                            O\\ = /O  \n");
    printf("                        ____/`---'\\____  \n");
    printf("                      .   ' \\| |// `.  \n");
    printf("                       / \\||| : |||// \\  \n");
    printf("                     / _||||| -:- |||||- \\  \n");
    printf("                       | | \\\\\\ - /// | |  \n");
    printf("                     | \\_| ''\\---/'' | |  \n");
    printf("                      \\ .-\\__ `-` ___/-. /  \n");
    printf("                   ___`. .' /--.--\\ `. . __  \n");
    printf("                ."" '< `.___\\_<|>_/___.' >'"".  \n");
    printf("               | | : `- \\`.;`\\ _ /`;.`/ - ` : | |  \n");
    printf("                 \\ \\ `-. \\_ __\\ /__ _/ .-` / /  \n");
    printf("         ======`-.____`-.___\\_____/___.-`____.-'======  \n");
    printf("                            `=---='  \n");
    printf("  \n");
    printf("         .............................................  \n");
    printf("                  佛祖镇楼                  BUG辟易  \n");
    printf("          佛曰:  \n");
    printf("                  写字楼里写字间,写字间里程序员;  \n");
    printf("                  程序人员写程序,又拿程序换酒钱。  \n");
    printf("                  酒醒只在网上坐,酒醉还来网下眠;  \n");
    printf("                  酒醉酒醒日复日,网上网下年复年。  \n");
    printf("                  但愿老死电脑间,不愿鞠躬老板前;  \n");
    printf("                  奔驰宝马贵者趣,公交自行程序员。  \n");
    printf("                  别人笑我忒疯癫,我笑自己命太贱;  \n");
    printf("                  不见满街漂亮妹,哪个归得程序员?\n");

}

int main() {
    
    // 函数调用
    func();
    func();
    func();

    return 0;
}

2 函数分类

从定义的角度来看(即函数是谁实现的),函数可以分为以下几类:

  • 系统函数:也称为库函数,存放在函数库中的函数,具有明确的功能、入口调用参数和返回值,这些函数由编译器的厂商提供实现,方便程序员进行软件开发。常见的库函数有printf()(用于打印信息到屏幕上)、strcpy()(用于字符串的拷贝)和pow()(用于计算数的次方)等。

  • 用户定义函数:为了满足用户的专门需要而编写的。用户可以自定义函数的名称、参数和返回值类型,并在函数体内实现特定的功能。这样,当需要在程序的多个地方执行相同的操作时,就可以调用这个函数,从而提高代码的可重用性和可维护性。

3 函数的定义

3.1 无参无返回值函数

无参数无返回值函数的语法格式

// 函数定义
void 函数名() 
{
    函数体
}

// 函数调用
函数名();

注意:

  • 函数名是标识符的一种,需要遵循规则

  • 函数只需要定义一次,反复调用

  • 只定义函数, 不调用函数, 函数永远不会被执行

需求:实现100以内的累加并输出结果

#include <stdio.h>

// 函数定义
void sum() {
    // 实现100以内的累加并输出结果
    int result = 0;
    for (int index = 1; index <= 100; ++index)
    {
        result += index;
    }
    
    printf("result = %d\n", result);
}

int main() 
{
    // 函数调用
    sum();

    return 0;
}

3.2 有参无返回值函数

        函数参数的作用是增加函数的灵活性,可以根据需求在调用函数时, 通过参数传入不同的数据。有参无返回值函数的语法格式:

// 函数定义
void 函数名(形参列表) 
{
    函数体
}

// 函数调用
函数名(实参列表);

注意,实参和形参的关系:从左往右,一一对应。

需求:实现任意两个数的相加,并输出相加之和。

#include <stdio.h>

// 函数定义
void my_add(int a, int b) 
{
    // 实现2个形参相加,并打印相加后的结果
    int res = a + b;
    
    printf("%d + %d = %d\n", a, b, res);
}

int main() 
{
    // 函数调用
    my_add(10, 20);

    return 0;
}

本段代码执行主要流程:

3.3 有参有返回值函数

        函数返回值的作用是函数外部想使用函数内部的数据,有参有返回值函数语法格式

// 函数定义
返回类型 函数名(形参列表) 
{
    函数体

    return 和返回类型一致的数据(或变量);
}

// 函数调用
和返回类型一致的变量 = 函数名(实参列表);

注意,return是函数的专属关键字,只能用在函数内容。

需求:编写一个函数,实现2个数相加,2个数通过参数传递,返回累加结果给外部使用

#include <stdio.h>

// 函数定义
int my_add(int a, int b) 
{
    // 实现2个形参相加,并返回累加的结果
    int res = a + b;
    
    return res;
}

int main() 
{
    // 函数调用
    int temp = my_add(10, 20);
    printf("temp  = %d\n", temp);

    return 0;
}

本段代码执行主要流程:

4 函数的声明

  • 如果函数定义代码没有放在函数调用的前面,这时候需要先做函数的声明

  • 所谓函数声明,相当于告诉编译器,函数是有定义的,再别的地方定义,以便使编译能正常进行

注意,一个函数只能被定义一次,但可以声明多次

#include <stdio.h>

// 函数的声明,分号不能省略
// 函数声明的前面可以加extern关键字,也可以不加
// extern int my_add(int a, int b);
int my_add(int a, int b);
// 另一种方式,形参名可以不写
// int my_add(int, int );

int main() 
{
    // 函数调用
    int temp = my_add(10, 20);
    printf("temp  = %d\n", temp);

    return 0;
}

// 函数定义
int my_add(int a, int b) 
{
    // 实现2个形参相加,并返回累加的结果
    int res = a + b;

    return res;
}

5 总结

        定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。当编写函数的时候,一开始不要想着函数如何传参和函数的返回值应该是什么而是当在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值。

使用函数的好处包括:

  • 定义一次,可以多次调用,减少代码的冗余度。

  • 模块化更好,方便调试程序,而且阅读方便

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

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

相关文章

【Spring】深入学习AOP编程思想的实现原理和优势

【切面编程】深入学习AOP编程思想的实现原理和优势 前言AOP的由来及AOP与代理的关系AOP的实现方式详解静态代理动态代理 AOP的应用场景记录日志权限控制数据库事务控制缓存处理异常处理监控管理 AOP的底层实现全流程解析Spring AOP的简介动态代理的实现原理Spring AOP的实现原理…

流水账(CPU设计实战)——lab3

Lab3 Rewrite V1.0 版本控制 版本描述V0V1.0相对V0变化&#xff1a; 修改了文件名&#xff0c;各阶段以_stage结尾&#xff08;因为if是关键词&#xff0c;所以module名不能叫if&#xff0c;遂改为if_stage&#xff0c;为了统一命名&#xff0c;将所有module后缀加上_stage&a…

关于Windows中桌面窗口管理器的知识,看这篇文章就可以了

序言 你打开了任务管理器,发现了一个叫做“桌面窗口管理器”的东西,它是恶意软件吗?它应该在任务管理器吗?如果它应该在那里,它的作用什么?以下是你需要了解的所有信息。 什么是桌面窗口管理器 Desktop Window Manager(dwm.exe)是一个合成窗口管理器,可以在Windows…

SB-OSC,最新的 MySQL Schema 在线变更方案

目前主流的 MySQL 在线变更方案有两个&#xff1a; 基于 trigger 的 pt-online-schema-change基于 binlog 的 gh-ost 上周 Sendbird 刚开源了他们的 MySQL Schema 在线变更方案 SB-OSC: Sendbird Online Schema Change。 GitHub 上刚刚 25 颗星星&#xff0c;绝对新鲜出炉。 …

Java | Leetcode Java题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution {public int maxDepth(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<TreeNode>();queue.offer(root);int ans 0;while (!queue.isEmpty()) {int size queue.size();wh…

go语言基准测试Benchmark 最佳实践-冒泡排序和快速排序算法基准测试时间复杂度对比

在go语言中Benchmark基准测试( 在后缀为_test.go的文件中&#xff0c;函数原型为 func BenchmarkXxx(b *testing.B) {}的函数 )可以用来帮助我们发现代码的性能和瓶颈&#xff0c; 其最佳实践 应该是我们最常用的 冒泡排序和快速排序的测试了&#xff0c;废话不说&#xff0c;直…

玄机平台应急响应—webshell查杀

1、前言 这篇文章说一下应急响应的内容&#xff0c;webshell查杀呢是应急响应的一部分。那么什么是应急响应呢&#xff0c;所谓的应急响应指的是&#xff0c;当网站突然出现异常情况或者漏洞时&#xff0c;能够马上根据实际问题进行分析&#xff0c;然后及时解决问题。 2、应…

软件游戏找不到xinput1_3.dll如何修复?分享几种有效的解决方法

当您在使用电脑过程中遇到系统提示“xinput1_3.dll文件丢失”时&#xff0c;这可能会导致某些游戏或应用程序无法正常运行&#xff0c;因为xinput1_3.dll是与DirectX相关的一个重要动态链接库文件&#xff0c;主要负责处理游戏控制器输入。为了解决这个问题&#xff0c;我通过查…

华为实训课笔记 2024

华为实训 5/205/215/225/235/275/28 5/20 5/21 5/22 5/23 5/27 5/28

蓝桥杯嵌入式国赛笔记(4):多路AD采集

1、前言 蓝桥杯的国赛会遇到多路AD采集的情况&#xff0c;这时候之前的单路采集的方式就不可用了&#xff0c;下面介绍两种多路采集的方式。 以第13届国赛为例 2、方法一&#xff08;配置通道&#xff09; 2.1 使用CubeMx配置 设置IN13与IN17为Single-ended 在Parameter S…

新增长100人研讨会:台州制造业企业共探数字驱动下的业绩增长策略

2024年5月17日&#xff0c;纷享销客联合鑫磊压缩机&#xff0c;在台州举办了一场主题为“数字化驱动下的业绩增长策略”的研讨会。本次会议汇聚台州多家制造行业的10余位数字化管理者&#xff0c;共同探讨在数字化转型浪潮中&#xff0c;制造业如何实现业绩的持续增长。 鑫磊压…

【hackmyvm】Slowman靶机

文章目录 主机探测端口探测FTP匿名登录 目录探测hydra爆破mysql爆破zip------fcrackzip爆破密码-----john提权 主机探测 ┌──(root㉿kali)-[/home/kali] └─# fping -ag 192.168.9.1/24 2>/dev/null 192.168.9.221 主机192.168.9.224 靶机端口探测 ┌──(roo…

蓝桥杯嵌入式国赛笔记(3):其他拓展板程序设计(温、湿度传感器、光敏电阻等)

目录 1、DS18B20读取 2、DHT11 2.1 宏定义 2.2 延时 2.3 设置引脚输出 2.4 设置引脚输入 2.5 复位 2.6 检测函数 2.7 读取DHT11一个位 2.7.1 数据位为0的电平信号显示 2.7.2 数据位为1的电平信号显示 2.8 读取DHT11一个字节 2.9 DHT11初始化 2.10 读取D…

【接口自动化_05课_Pytest接口自动化简单封装与Logging应用】

一、关键字驱动--设计框架的常用的思路 封装的作用&#xff1a;在编程中&#xff0c;封装一个方法&#xff08;函数&#xff09;主要有以下几个作用&#xff1a;1. **代码重用**&#xff1a;通过封装重复使用的代码到一个方法中&#xff0c;你可以在多个地方调用这个方法而不是…

【Linux学习】进程间通信 (3) —— System V (1)

下面是有关进程通信中 System V 的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. System V IPC 1. 消息队列 msg 消息队列的使用方法 1.1 消息队列的创建 1.2 向消息队列发送消息 1.3 从消息队列接收消息 1.4 使用msgctl函数显式地…

Java面试八股之对threadLocal是怎么理解的

对threadLocal是怎么理解的 概念与特点&#xff1a;ThreadLocal是Java提供的一个类&#xff0c;它允许你创建线程局部变量。每个线程都拥有自己的ThreadLocal变量副本&#xff0c;彼此之间互不影响&#xff0c;实现了变量在线程间的隔离。这意味着&#xff0c;即使多个线程使用…

《C++ Primer Plus》第十二章复习题和编程练习

目录 一、复习题二、编程练习 一、复习题 1. 假设String类有如下私有成员&#xff1a; // String 类声明 class String { private: char* str;int len;// ... };a. 下述默认构造函数有什么问题&#xff1f; String::String() { } // 默认构造函数b. 下述构造函数有什么问题…

浅谈JMeter运行原理

浅谈JMeter运行原理 JMeter架构基础 JMeter基于Java平台开发&#xff0c;运行于Java虚拟机&#xff08;JVM&#xff09;之上。这意味着它可以在任何支持JVM的操作系统上运行&#xff0c;包括Windows、Linux、macOS等。其核心架构设计围绕着多线程执行机制&#xff0c;这使得它…