C语言-章节 4:函数的定义与声明 ——「神秘法术的卷轴」
少年和 Inta 成功通过运算符与表达式的考验后,继续在函数城堡中探索。他们沿着一条闪烁着幽光的走廊前行,走廊两侧的墙壁上刻满了奇异的符号,仿佛在诉说着古老的编程秘密。终于,他们来到了一间神秘的房间,房间中央悬浮着一卷散发着金色光芒的卷轴。
“这就是「神秘法术的卷轴」,据说里面藏着函数的定义与声明的奥秘。”Inta 眼中闪烁着兴奋的光芒。

就在这时,一位身着长袍的智者凭空出现,他的眼神深邃而睿智,仿佛能看穿一切。智者缓缓开口:“在 C 语言中,函数是程序的基本构建块,它将一组相关的语句组合在一起,完成特定的任务。函数的使用有助于提高代码的模块化程度和可复用性。下面我就详细给你们讲讲 C 语言函数的定义与声明。”
“函数的定义是指具体实现函数功能的代码块,它包含了函数的名称、参数列表、返回值类型以及函数体。其语法格式如下:” 智者说着,手中魔杖一挥,空中浮现出代码:
c
返回值类型 函数名(参数列表) {// 函数体,包含具体的执行语句return 返回值; // 如果返回值类型为 void,则可以省略 return 语句
}
“下面我来解释各部分的含义。返回值类型指定函数执行完毕后返回的数据类型,像 int、float、char 等。要是函数不返回任何值,就使用 void 类型。
每个参数由数据类型和参数名组成。要是函数不需要参数,参数列表可以为空,或者使用 void 明确表示。函数体由一对花括号 {} 括起来,里面包含了实现函数功能的具体语句。
return 语句用于将函数的执行结果返回给调用者,返回值的类型必须与函数定义时指定的返回值类型一致。”
智者说完,又展示了两个示例代码:
c
// 定义一个计算两个整数之和的函数
int add(int a, int b) {int sum = a + b;return sum;
}// 定义一个不返回值且无参数的函数
void printHello() {printf("Hello, World!\n");// 由于返回值类型为 void,这里可以省略 return 语句
}
少年和 Inta 认真地听着,不时点头表示理解。
智者接着说:“函数的声明则是向编译器告知函数的名称、返回值类型和参数列表,这样在调用函数之前,编译器就能知道函数的原型。函数声明通常放在源文件的开头或者头文件中。
“函数声明的语法和函数定义类似,但只需要函数的签名,也就是返回值类型、函数名和参数列表,不需要函数体,并且在语句末尾要加上分号 ;。”
智者又给出了示例:
c
// 函数声明
int add(int a, int b);
void printHello();#include <stdio.h>int main() {int result = add(3, 5);printf("3 + 5 = %d\n", result);printHello();return 0;
}// 函数定义
int add(int a, int b) {int sum = a + b;return sum;
}void printHello() {printf("Hello, World!\n");
}
“函数声明有两个重要作用。
一是告知编译器函数的存在,在调用函数之前,编译器需要知道函数的返回值类型和参数列表,这样才能进行类型检查和生成正确的调用代码。
二是允许函数在调用之后再定义,如果没有函数声明,函数的定义必须放在调用之前,否则编译器会报错。有了函数声明,函数的定义可以放在调用之后,这样能提高代码的组织性和可读性。”
智者继续提醒道:“这里有一些注意事项。在函数声明中,参数名可以省略,只保留参数的类型,比如 int add(int, int);
但在函数定义中,参数名不能省略。在大型项目中,通常把函数声明放在头文件(.h 文件)中,然后在源文件(.c 文件)中包含该头文件,这样方便多个源文件共享函数声明。比如创建一个名为 functions.h 的头文件:” 智者展示了头文件的代码:
c
// functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_Hint add(int a, int b);
void printHello();#endif
“然后在源文件 main.c 中包含该头文件:”
c
// main.c
#include <stdio.h>
#include "functions.h"int main() {int result = add(3, 5);printf("3 + 5 = %d\n", result);printHello();return 0;
}
“同时,在 functions.c 文件中实现这些函数:”
c
// functions.c
#include <stdio.h>int add(int a, int b) {int sum = a + b;return sum;
}void printHello() {printf("Hello, World!\n");
}
“通过这种方式,可以将函数的声明和定义分离,提高代码的可维护性和可扩展性。”
智者刚讲完,房间的四个角落突然射出四道光芒,每道光芒中都浮现出一道题目。
第一题:定义一个函数来计算两个整数的乘积,并调用这个函数计算 4 和 6 的乘积。
少年略作思考,拿出一支魔法笔,在地上写下代码:
c
#include <stdio.h>// 函数声明
int multiply(int a, int b);// 函数定义
int multiply(int a, int b) {return a * b;
}int main() {int result = multiply(4, 6);printf("4 和 6 的乘积是: %d\n", result);return 0;
}
刚写完,地上的代码开始发光,一个虚拟屏幕出现,显示出程序的运行结果:
plaintext
4 和 6 的乘积是: 24
第二题:声明并定义一个函数,判断一个整数是否为正数,如果是则返回 1,否则返回 0,然后调用该函数判断 -5 是否为正数。
少年迅速写下代码:
c
#include <stdio.h>// 函数声明
int isPositive(int num);// 函数定义
int isPositive(int num) {return num > 0;
}int main() {int result = isPositive(-5);printf("-5 是否为正数: %s\n", result ? "是" : "否");return 0;
}
代码写完,虚拟屏幕再次出现,显示运行结果:
plaintext
-5 是否为正数: 否
第三题:定义一个函数,求三个整数中的最大值,并调用该函数找出 2、9 和 5 中的最大值。
少年思考片刻,写下如下代码:
c
#include <stdio.h>// 函数声明
int findMax(int a, int b, int c);// 函数定义
int findMax(int a, int b, int c) {int max = a;if (b > max) {max = b;}if (c > max) {max = c;}return max;
}int main() {int result = findMax(2, 9, 5);printf("2、9 和 5 中的最大值是: %d\n", result);return 0;
}
随后,运行结果出现在屏幕上:
plaintext
2、9 和 5 中的最大值是: 9
第四题:声明并定义一个函数,将一个整数的每一位数字相加,并调用该函数计算 123 各位数字之和。
少年认真分析题目后,写下代码:
c
#include <stdio.h>// 函数声明
int digitSum(int num);// 函数定义
int digitSum(int num) {int sum = 0;while (num != 0) {sum += num % 10;num /= 10;}return sum;
}int main() {int result = digitSum(123);printf("123 各位数字之和是: %d\n", result);return 0;
}
屏幕上很快显示出运行结果:
plaintext
123 各位数字之和是: 6
随着四个题目全部解答完毕,悬浮的卷轴缓缓展开,散发出耀眼的光芒。智者微笑着说:“你们已经掌握了函数的定义与声明的基本要领,带着这份知识继续前行吧,前方还有更多的挑战等待着你们。”
少年和 Inta 满怀信心地拿起卷轴,朝着房间的另一扇门走去,他们知道,新的冒险即将开始。
编程启示录
“函数的定义与声明是 C 语言编程中强大的工具,就像神秘法术的卷轴,能将复杂的任务分解成一个个小的、可复用的模块。函数声明为程序提供了清晰的接口,而函数定义则实现了具体的功能。合理运用函数,能让代码更加简洁、易读和可维护。在面对各种编程问题时,要善于将问题拆解,通过定义和调用函数来解决。”
相关文章:
C语言-章节 4:函数的定义与声明 ——「神秘法术的卷轴」
少年和 Inta 成功通过运算符与表达式的考验后,继续在函数城堡中探索。他们沿着一条闪烁着幽光的走廊前行,走廊两侧的墙壁上刻满了奇异的符号,仿佛在诉说着古老的编程秘密。终于,他们来到了一间神秘的房间,房间中央悬浮…...
《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理
从攻击者的角度来看,针对容器镜像的软件供应链攻击和镜像投毒等攻击方式,不仅攻击成本低,而且还能带来更高且持久的收益。因此,镜像安全问题变得日益突出。 在本节课程中,我们将深入探讨镜像全生命周期的安全管理&…...
uniapp商城之首页模块
文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…...
【Javascript Day13、14、15、16】
html的DOM操作 // JS 是为了让页面实现动态网页效果 // 动态和静态区分取决于JS的和页面标签的数据交互 // 动态网页:有数据交互 // 静态网页:无数据交互 // JS 和 元素的关联操作对象 DOM // 整个HT…...
linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上
linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上 这里的问题是 /usr/share/udhcpc/default.script脚本有问题 用下面正确脚本,即可写进去 #!/bin/sh# udhcpc script for busybox # Copyr…...
openGauss 3.0 数据库在线实训课程13: 学习逻辑结构:表管理1
前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见:openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss表的创建、搜索路径和访问方法等 课程作业 1.创建一个表(默认,不指定模式),查…...
网络编程-
文章目录 网络编程套接字UDP/TCP的api使用 网络编程套接字 socket,是操作系统给应用程序(传输层给应用层)提供的api,Java也对这个api进行了封装。 socket提供了两组不同的api,UDP有一套,TCP有一套&#x…...
基于单片机的常规肺活量SVC简单计算
常规肺活量 SVC(Slow Vital Capacity)是指尽力吸气后缓慢而又完全呼出的最大气量。 成年男性的肺活量通常在 3500-4000ml 之间,成年女性的肺活量通常在 2500-3000ml 之间。 单片机一般通过外接流量传感器,使用ADC高速采集的方式…...
【PostgreSQL】PG在windows下的安装
一、准备 通过官网下载安装文件,官方下载路径如下: https://www.postgresql.org/download/windows/ 二、安装 双击postgresql-17.3-1-windows-x64.exe文件,启动安装,进入安装步骤,点击Next 选择PG安装路径ÿ…...
电动汽车电池监测平台系统设计(论文+源码+图纸)
1总体设计 本次基于单片机的电池监测平台系统设计,其整个系统架构如图2.1所示,其采用STC89C52单片机作为控制器,结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统,在功能上可以实现电压、电流、…...
基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真。可以设置多个不同的中心点。 2.测试软件版本以及运行结果展示 matlab2022a/matlab2024b版…...
单链表的概念,结构和优缺点
1. 概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 2. 单链表的结构 单链表是由一系列节点组成的线性结构,每个结点包含两个域。:数据域和指针域。 数据域用来…...
SpringBoot+数据可视化的奶茶点单购物平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 本奶茶点单购物平台搭建在 Spring Boot 框架之上,充分利用其强大的依赖管理机…...
深入理解 Vue3 中 ref 与 reactive 的区别及应用
深入理解 Vue3 中 ref 与 reactive 的区别及应用 在 Vue3 的开发世界里,响应式编程是其核心特性之一,而ref与reactive作为实现响应式的关键 API,理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API,…...
TDengine 客户端连接工具 taos-Cli
简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具(以下简称 TDengine CLI)是用户操作 TDengine 实例并与之交互最简…...
Linux(ubuntu)下载ollama速度慢解决办法
国内安装Ollama都很慢,因为一直卡在下载中,直接通过官网的链接地址下载方法: curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%,完全不能接受啊! 其中很好的一个加速方式是通过使用github文件加速…...
Mac安装JD-GUI
Mac安装反编译工具步骤如下: 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包,点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK,通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…...
Jenkins 配置 Git Parameter 四
Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件,请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...
【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南
【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型,本文将详细介绍整个过程,涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…...
Python 自然语言处理(NLP)和文本挖掘的常规操作过程
Python 自然语言处理(NLP)和文本挖掘 自然语言处理(NLP)和文本挖掘是数据科学中的重要领域,涉及对文本数据的分析和处理。Python 提供了丰富的库和工具,用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
