当前位置: 首页 > news >正文

C语言-章节 4:函数的定义与声明 ——「神秘法术的卷轴」

        少年和 Inta 成功通过运算符与表达式的考验后,继续在函数城堡中探索。他们沿着一条闪烁着幽光的走廊前行,走廊两侧的墙壁上刻满了奇异的符号,仿佛在诉说着古老的编程秘密。终于,他们来到了一间神秘的房间,房间中央悬浮着一卷散发着金色光芒的卷轴。

        “这就是「神秘法术的卷轴」,据说里面藏着函数的定义与声明的奥秘。”Inta 眼中闪烁着兴奋的光芒。

        就在这时,一位身着长袍的智者凭空出现,他的眼神深邃而睿智,仿佛能看穿一切。智者缓缓开口:“在 C 语言中,函数是程序的基本构建块,它将一组相关的语句组合在一起,完成特定的任务。函数的使用有助于提高代码的模块化程度和可复用性。下面我就详细给你们讲讲 C 语言函数的定义与声明。”

        “函数的定义是指具体实现函数功能的代码块,它包含了函数的名称、参数列表、返回值类型以及函数体。其语法格式如下:” 智者说着,手中魔杖一挥,空中浮现出代码:

c

返回值类型 函数名(参数列表) {// 函数体,包含具体的执行语句return 返回值; // 如果返回值类型为 void,则可以省略 return 语句
}

        “下面我来解释各部分的含义。返回值类型指定函数执行完毕后返回的数据类型,像 intfloatchar 等。要是函数不返回任何值,就使用 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");
}

        “通过这种方式,可以将函数的声明和定义分离,提高代码的可维护性和可扩展性。”

        智者刚讲完,房间的四个角落突然射出四道光芒,每道光芒中都浮现出一道题目。

        第一题:定义一个函数来计算两个整数的乘积,并调用这个函数计算 46 的乘积。

        少年略作思考,拿出一支魔法笔,在地上写下代码:

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 是否为正数: 否

        第三题:定义一个函数,求三个整数中的最大值,并调用该函数找出 295 中的最大值。

少年思考片刻,写下如下代码:

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 成功通过运算符与表达式的考验后&#xff0c;继续在函数城堡中探索。他们沿着一条闪烁着幽光的走廊前行&#xff0c;走廊两侧的墙壁上刻满了奇异的符号&#xff0c;仿佛在诉说着古老的编程秘密。终于&#xff0c;他们来到了一间神秘的房间&#xff0c;房间中央悬浮…...

《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理

从攻击者的角度来看&#xff0c;针对容器镜像的软件供应链攻击和镜像投毒等攻击方式&#xff0c;不仅攻击成本低&#xff0c;而且还能带来更高且持久的收益。因此&#xff0c;镜像安全问题变得日益突出。 在本节课程中&#xff0c;我们将深入探讨镜像全生命周期的安全管理&…...

uniapp商城之首页模块

文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…...

【Javascript Day13、14、15、16】

html的DOM操作 // JS 是为了让页面实现动态网页效果 // 动态和静态区分取决于JS的和页面标签的数据交互 // 动态网页&#xff1a;有数据交互 // 静态网页&#xff1a;无数据交互 // JS 和 元素的关联操作对象 DOM // 整个HT…...

linux 板子的wifi模块连上路由器后,用udhcpc给板子wifi分配ip,udhcpc获取到ip,但没有写入wlan0网卡上

linux 板子的wifi模块连上路由器后&#xff0c;用udhcpc给板子wifi分配ip&#xff0c;udhcpc获取到ip,但没有写入wlan0网卡上 这里的问题是 /usr/share/udhcpc/default.script脚本有问题 用下面正确脚本&#xff0c;即可写进去 #!/bin/sh# udhcpc script for busybox # Copyr…...

openGauss 3.0 数据库在线实训课程13: 学习逻辑结构:表管理1

前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss表的创建、搜索路径和访问方法等 课程作业 1.创建一个表&#xff08;默认&#xff0c;不指定模式&#xff09;&#xff0c;查…...

网络编程-

文章目录 网络编程套接字UDP/TCP的api使用 网络编程套接字 socket&#xff0c;是操作系统给应用程序&#xff08;传输层给应用层&#xff09;提供的api&#xff0c;Java也对这个api进行了封装。 socket提供了两组不同的api&#xff0c;UDP有一套&#xff0c;TCP有一套&#x…...

基于单片机的常规肺活量SVC简单计算

常规肺活量 SVC&#xff08;Slow Vital Capacity&#xff09;是指尽力吸气后缓慢而又完全呼出的最大气量。 成年男性的肺活量通常在 3500-4000ml 之间&#xff0c;成年女性的肺活量通常在 2500-3000ml 之间。 单片机一般通过外接流量传感器&#xff0c;使用ADC高速采集的方式…...

【PostgreSQL】PG在windows下的安装

一、准备 通过官网下载安装文件&#xff0c;官方下载路径如下&#xff1a; https://www.postgresql.org/download/windows/ 二、安装 双击postgresql-17.3-1-windows-x64.exe文件&#xff0c;启动安装&#xff0c;进入安装步骤&#xff0c;点击Next 选择PG安装路径&#xff…...

电动汽车电池监测平台系统设计(论文+源码+图纸)

1总体设计 本次基于单片机的电池监测平台系统设计&#xff0c;其整个系统架构如图2.1所示&#xff0c;其采用STC89C52单片机作为控制器&#xff0c;结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统&#xff0c;在功能上可以实现电压、电流、…...

基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真。可以设置多个不同的中心点。 2.测试软件版本以及运行结果展示 matlab2022a/matlab2024b版…...

单链表的概念,结构和优缺点

1. 概念 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 2. 单链表的结构 单链表是由一系列节点组成的线性结构&#xff0c;每个结点包含两个域。&#xff1a;数据域和指针域。 数据域用来…...

SpringBoot+数据可视化的奶茶点单购物平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 本奶茶点单购物平台搭建在 Spring Boot 框架之上&#xff0c;充分利用其强大的依赖管理机…...

深入理解 Vue3 中 ref 与 reactive 的区别及应用

深入理解 Vue3 中 ref 与 reactive 的区别及应用 在 Vue3 的开发世界里&#xff0c;响应式编程是其核心特性之一&#xff0c;而ref与reactive作为实现响应式的关键 API&#xff0c;理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API&#xff0c;…...

TDengine 客户端连接工具 taos-Cli

简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具&#xff08;以下简称 TDengine CLI&#xff09;是用户操作 TDengine 实例并与之交互最简…...

Linux(ubuntu)下载ollama速度慢解决办法

国内安装Ollama都很慢&#xff0c;因为一直卡在下载中&#xff0c;直接通过官网的链接地址下载方法&#xff1a; curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%&#xff0c;完全不能接受啊&#xff01; 其中很好的一个加速方式是通过使用github文件加速…...

Mac安装JD-GUI

Mac安装反编译工具步骤如下&#xff1a; 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包&#xff0c;点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK&#xff0c;通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…...

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型&#xff0c;本文将详细介绍整个过程&#xff0c;涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…...

Python 自然语言处理(NLP)和文本挖掘的常规操作过程

Python 自然语言处理&#xff08;NLP&#xff09;和文本挖掘 自然语言处理&#xff08;NLP&#xff09;和文本挖掘是数据科学中的重要领域&#xff0c;涉及对文本数据的分析和处理。Python 提供了丰富的库和工具&#xff0c;用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...