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

相关文章:

  • stm32mp集成swupdateOTA升级
  • docker nginx 配置文件详解
  • vuedraggable固定某一item的记录
  • CentOS安装Docker,Ubuntu安装Docker,Docker解决方案
  • 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控
  • LeapMotion第2代 Unity示范代码(桌面开发)
  • 快速幂(算法)的原理
  • SQLMesh系列教程-2:SQLMesh入门项目实战(下篇)
  • 【银河麒麟高级服务器操作系统】服务器卡死后恢复系统日志丢失-分析及处理全过程
  • gitee 配置密钥key过程
  • 通过内网穿透ssh实现远程对家里的linux进行终端操作和编程
  • 20250213编译飞凌的OK3588-C_Linux5.10.209+Qt5.15.10_用户资料_R1
  • Java 同步锁性能的最佳实践:从理论到实践的完整指南
  • SQLite数据库中查询性能优化及索引创建的原则总结
  • Cesium for Unity Linux版本
  • 在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南
  • 2025.2.8——一、[护网杯 2018]easy_tornado tornado模板注入
  • Quartz定时任务
  • 支持直接升级到21c的 Oracle 数据库版本
  • QT中线程中使用信号和槽传数据
  • 马斯克的胜利?OpenAI迫于压力放弃营利性转型计划
  • 五一假期上海境外来沪消费4.55亿元,同比增长211.6%
  • 特朗普要征100%关税,好莱坞这批境外摄制新片能躲过吗?
  • 国铁集团:铁路五一假期旅客发送量累计已超1亿人次
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 烟花秀、新航线、购物节......上海邮轮文化旅游节今日开幕