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

news2025/4/17 9:33:30

        少年和 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_H

int 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 语言编程中强大的工具,就像神秘法术的卷轴,能将复杂的任务分解成一个个小的、可复用的模块。函数声明为程序提供了清晰的接口,而函数定义则实现了具体的功能。合理运用函数,能让代码更加简洁、易读和可维护。在面对各种编程问题时,要善于将问题拆解,通过定义和调用函数来解决。”

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

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

相关文章

47.实验室管理系统(基于SSM和html的Java项目)

目录 1.系统的受众说明 2.系统可行性分析 2.1 经济可行性 2.2 技术可行性 2.2.1 Java Web技术 2.2.2 Eclipse 2.2.3 Tomcat 2.2.4 数据库 2.2.5 Layui框架 2.2.6 SSM框架 3.系统需求分析 3.1 用户需求分析 3.2 功能需求分析 3.3 其他需求分析 4.系统设计 4.1 系…

【免费送书活动】《MySQL 9从入门到性能优化(视频教学版)》

本博主免费赠送读者3本书&#xff0c;书名为《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》。 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 这本书已经公开…

【人工智能】通过python练习机器学习中的8大算法

python一系列练习在前面几节中基本练习了一遍&#xff0c;本篇通过机器学习的算法加强python的训练。我印象中常用的几种算法有&#xff1a;线性回归、逻辑回归&#xff0c;决策树&#xff0c;向量机SVM&#xff0c;KNN-近邻&#xff0c;朴素贝叶斯&#xff0c;K-means&#xf…

Android Studio2024版本安装环境SDK、Gradle配置

一、软件版本&#xff0c;安装包附上 &#x1f449;android-studio-2024.1.2.12-windows.exe&#x1f448; &#x1f449;百度网盘Android Studio安装包&#x1f448; &#xff08;若下载连链接失效可去百度网盘链接下载&#xff09; 二、软件安装过程 ​ ​ ​ 三、准备运行…

RabbitMQ学习—day2—安装

目录 普通Linux安装 安装RabbitMQ 1、下载 2、安装 3. Web管理界面及授权操作 Docker 安装 强力推荐学docker&#xff0c;使用docker安装 普通Linux安装 安装RabbitMQ 1、下载 官网下载地址&#xff1a;https://www.rabbitmq.com/download.html(opens new window) 这…

Jenkins 新建配置Pipeline任务 三

Jenkins 新建配置Pipeline任务 三 一. 登录 Jenkins 网页输入 http://localhost:8080 输入账号、密码登录 一个没有创建任务的空 Jenkins 二. 创建 任务 图 NewItem 界面左上角 New Item 图NewItemSelect 1.Enter an item name&#xff1a;输入任务名 2.Select an ite…

社区版IDEA中配置TomCat(详细版)

文章目录 1、下载Smart TomCat2、配置TomCat3、运行代码 1、下载Smart TomCat 由于小编的是社区版&#xff0c;没有自带的tomcat server&#xff0c;所以在设置的插件里面搜索&#xff0c;安装第一个&#xff08;注意&#xff1a;安装时一定要关闭外网&#xff0c;小编因为这个…

MATLAB 生成脉冲序列 pulstran函数使用详解

MATLAB 生成脉冲序列 pulstran函数使用详解 目录 前言 一、参数说明 二、示例一 三、示例二 总结 前言 MATLAB中的pulstran函数用于生成脉冲序列&#xff0c;支持连续或离散脉冲。该函数通过将原型脉冲延迟并相加&#xff0c;生成脉冲序列&#xff0c;适用于信号处理和系统…

概率论、组合数学知识点汇总

1、概率论知识点 全概率公式&#xff1a;如果事件B1,B2,…,Bn是样本空间的一个划分&#xff0c;则&#xff1a;贝叶斯定理&#xff1a;协方差&#xff1a;协方差用来衡量两个变量之间的变化趋势是否一致&#xff0c;公式为相关系数&#xff08;Pearson&#xff09;&#xff1a…

【人工智能】deepseek R1模型在蓝耘智算平台的搭建与机器学习的探索

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 蓝耘智算平台 deepseek R1简介与优点蓝耘智算平台蓝耘智算平台简介蓝耘智算平台优势deepseek R1模型在蓝耘智算平台的搭建模型使用与机器学习…

tomcat html乱码

web tomcat html中文乱码 将html文件改成jsp <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%>添加 <meta charset"UTF-8">

基于单片机的智能奶茶机(论文+源码+图纸)

1总体架构设计 本课题为基于单片机的智能奶茶机设计&#xff0c;其系统架构上设计如图2.1所示&#xff0c;整个系统包括了DS18B20温度传感器、继电器模块、LCD液晶、蜂鸣器、按键、STC89C52单片机等器件&#xff0c;在功能上用户可以通过按键键控制选择甜度和添加物以及设置温度…

Centos7系统安装redis

Centos7系统安装redis 下载编译配置配置环境变量服务脚本安装使用远程连接 下载 下载地址&#xff1a;https://download.redis.io/releases/&#xff0c;选择版本6.2.7 具体下载链接&#xff1a;https://download.redis.io/releases/redis-6.2.7.tar.gz 操作&#xff1a;在ro…

图数据库neo4j进阶(一):csv文件导入节点及关系

CSV 一、load csv二、neo4j-admin import<一>、导入入口<二>、文件准备<三>、命令详解 一、load csv 在neo4j Browser中使用Cypher语句LOAD CSV,对于数据量比较大的情况,建议先运行create constraint语句来生成约束 create constraint for (s:Student) req…

深度剖析责任链模式

一、责任链模式的本质&#xff1a;灵活可扩展的流水线处理 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是行为型设计模式的代表&#xff0c;其核心思想是将请求的发送者与接收者解耦&#xff0c;允许多个对象都有机会处理请求。这种模式完美解决了以下…

floodfill算法系列一>岛屿的最大面积

题解 整体思路&#xff1a;代码设计&#xff1a;代码呈现&#xff1a; 整体思路&#xff1a; 代码设计&#xff1a; 代码呈现&#xff1a; class Solution {int ret,m,n,count;boolean[][] vis;public int maxAreaOfIsland(int[][] grid) {m grid.length;n grid[0].length;v…

手机用流量怎样设置代理ip?

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet

游戏引擎学习第100天

仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天&#xff0c;我们开始了反射和环境贴图的工作&#xff0c;成功地根据法线显示了反射效果。然而&#xff0c;我们还没有实现反射向量的计算&#xff0c;导致反射交点的代…

AT32系列微控制器低压电机控制开发板

参考&#xff1a;《UM0014_AT32_LV_Motor_Control_EVB_V20_User_Manual_V1.0.1_ZH.pdf》 开发板介绍 此电机开发板是一个泛用型的低压三相电机驱动器&#xff0c;应用雅特力科技AT32系列微控制器搭配雅特力电机函数库&#xff0c;可驱动直流无刷电机、交流同步电机&#xff0…

如何保持 mysql 和 redis 中数据的一致性?PegaDB 给出答案

MySQL 与 Redis 数据保持一致性是一个常见且复杂的问题&#xff0c;一般来说需要结合多种策略来平衡性能与一致性。 传统的解决策略是先读缓存&#xff0c;未命中则读数据库并回填缓存&#xff0c;但方式这种维护成本较高。 随着云数据库技术的发展&#xff0c;目前国内云厂商…