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 和文本挖掘任务。以下是一些常见的…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
