你好, 欢迎回来｡
在这堂课中, 我想谈谈 关于在C中定义函数｡
定义函数｡
我们知道功能的重要性｡
我们了解其优势｡
我们会想用 函数｡
所以当你创建一个pro函数 在c中, 必须将函数头指定为第一行
函数的定义｡
我们将讨论如何定义 函数,
我们还会讨论函数的实现.
实现函数 就是解决问题,
就是普通的c代码
定义函数就是说 函数存在｡
因此,
当您定义函数时, 首先你要做的就是得到函数头, 然后 函数的块代码以花括号开头｡
这就像你用一个
if语句中的花括号, 就像使用花括号一样 在for循环中, 除了函数需要花括号｡
无法消除它｡
它总是意味着 该函数的代码｡
在开始和结束之间 结束的花括号是函数的代码｡
这是你要去的地方 以执行任务｡
所以括号之间是 调用函数体和函数的第一行
称为函数头｡
函数头定义 函数名, 函数的参数｡
我们将讨论 参数和参数的详细信息｡
但现在你只要 需要知道参数的存在｡
参数将指定
值的数量和类型如何传递数据､ 参数 与传递数据有关｡
值的类型 函数返回的值｡
我们提到过函数 我们可以返回数据｡
所以在函数头中, 你会得到函数的名字, 你可以把可以接受的函数和数据
函数返回的值｡
我们现在不打算关注 可以传递的数据或返回的数据, 我们只需要
讨论如何创建一个简单的函数｡
函数体包含 只是常规代码, 当您
调用或叫用函数｡
而函数体本身 将可以存取任何当做参数传递的值｡
所以你传递给 您可以利用函数体中数据｡
它看起来像是 这就是函数头｡
函数头具有第一个字｡
而函数头是一个 关键字, 表示要
函数返回的值｡
下一个关键字是 返回函数的名称｡
然后你有一个左括号 然后用逗号分隔参数, 这就是数据
传递给函数的值｡
然后你就有了 右括号以结束函数头｡
然后是花括号 这表示函数实现的开始｡
你有很多 语句来执行任务｡
就像我说的, 你想 让你的函数变小｡
他们想要有凝聚力｡
他们不想成为 到处都是｡
他们想有一个单 集中注意力, 做一些具体事情｡
就像我说的如果你有一个函数 它读取输入｡
它不打印输出｡
它不进行任何排序 或者什么都不做｡
如果您有一个名为 sort, 它对数据进行排序｡
它不接受输入｡
功能需要 粘性和小｡
调试这些代码要容易得多 函数, 所以要使它们具有内聚性｡
然后你就有权利 大括号,
结束函数实现｡
这是一个什么功能 看起来像C中的｡
现在让我们关注函数 名称,
稍后我们将讨论参数和返回类型｡
函数的第一行又 定义告诉编译器从左到右的三件事
关于函数的信息｡
返回的值的类型, 函数的名称, 然后是它所使用的任何数据｡
这只是总结, 这很重要｡
至于函数名, 您需要 选择有意义的函数名｡
这和选择 有意义的变量名称｡
它极大地影响了 程序的可读性,
所以不要命名函数x或y｡
基于函数命名 它会做什么
如果是加二 数字, 将其命名为add｡
如果是减2 数字, 将其命名为减法｡
在本例中, 我们的简单功能｡
不用担心空虚, 你只要担心这里的名字就行了｡
我们有一个功能 命名打印消息
然后我们看到花括号
表示函数开始, 然后 我们有一些实现｡
而这个实现 只不过是显示一个字符串,
一个文本｡
然后我们就有了 右大括号｡
所以这是一个非常简单的函数 并不做什么, 只是显示输出｡
在本例中为打印
打印消息的第一行告诉编译器 该函数不返回任何值｡
这是关键词void｡
再一次, 不需要关注 但这就是它的作用
接下来是名字｡
然后在名字之后是 参数, 它们被称为参数｡
我们再次使用关键字void 如果我们不传递任何数据｡
函数中的语句 body可以不存在, 但大括号必须始终存在｡
所以你不需要 实现, 但必须有大括号才能在其中显示函数｡
如果中没有语句 函数体, 返回类型必须为void｡
同样, 我们稍后会重点讨论这个问题 并且函数不会执行任何操作,
因为您没有实现｡
如果使用 一个空的身体, 它仍然可以是有用的, 即使它是
一事无成｡
你通常在 非常大的程序的测试阶段｡
这让你可以
你只能运行某些特定的函数 帮助你更好地测试, 帮助你隔离错误｡
您甚至可以实现 在函数体的测试中,
但只将其注释掉｡
然后你就可以这样做了 分而治之方法｡
随着你测试的越来越多 更多, 您就可以开始在函数体中放置实现了｡
这是一个循序渐进的过程 工作过程｡
你不断地在小 块､ 添加代码､ 测试该代码, 然后继续下一个
步骤, 然后最终将完成整个实现, 并
将实现所有功能｡
因此, 有一个使用案例
具有没有代码或被注释掉的函数体｡
命名函数｡
函数的名称 可以是任何法律的名称｡
就像当你 命名变量时,
不能使用保留字｡
这些是 因为它们表示数据类型｡
Sizeof是一个运算符｡
您希望能够 用于或如果｡
你也不可能有两个 相同名称的函数｡
这也是 函数重载｡
但你不能同时拥有两个功能 具有相同的名称, 则C中不支持重载｡
最后, 您可以拥有相同的 name作为标准库函数中的函数｡
技术上讲如果你不包括 该库包含头文件, 您也许可以拥有它｡
但如果你真的想用 库函数, 编译器会抱怨,
说您有 两个同名的函数｡
因此, 不要将函数命名为 与标准库函数相同｡
法律的名称与 一个变量,
一个字母和数字序列开始｡
第一个字符必须是字母 并且字母可以是下划线｡
您无法启动函数 用数字或者其他奇怪的字符｡
您选择的名称应 有意义并与函数的作用相关｡
我已经说过了, 我再说一遍 为了强调,
有意义的名字是非常重要的｡
你会经常定义函数 名称和变量名也包含多个单词｡
所以现在我想谈谈 关于编码风格的一点｡
你可能已经注意到了 我写了我的代码, 我使用骆驼的情况｡
有三种不同的方式 您可以编写变量和函数的名称｡
你可以把每个单词 在带有下划线字符函数名中,
这是一种方法｡
您可以大写首字母
也可以大写第一个单词后的单词, 并且 你们还得一起弹
记住, 你不能 中间有空隙｡
这只是一种
命名是因为遵循一些约定很重要 这样更容易阅读｡
只是说了很长一段话 五个不同的词｡
所以如果你有一个函数 检查输入是否有效, 您不会希望输入全部小写｡
很难读懂而且 找出单词的位置｡
所以骆驼案是一种 在许多单词中识别单词的位置, 这很容易看到
这个函数在做什么
下划线是另一个 来分隔单词｡
并将 每个单词都是另一种分隔方式｡
重要的是能够 将函数中的单词分开, 使其更易读｡
我通常用骆驼牌｡
当你使用其中一个
你想用它来做任何事情, 你想用 它用于命名变量, 您希望将它用于函数名称｡
通常你只要按照这个 通用的编码约定, 它使东西更可读｡
函式原型｡
我们讨论过定义函数｡
那么声明一个函数呢？
你可以说你为什么需要 声明一个函数, 当你定义它时候,
你不是在声明它吗？
但也有一个概念 声明函数｡
如果你想的话 在函数被实现和定义之前使用它｡
所以函数原型是一个 定义函数的语句｡
它告诉编译器 函数的所有细节｡
它定义了它的名称､ 返回类型和 返回其每个参数的类型｡
所以它看起来像一个函数头｡
它提供了所有外部
函数的规格说明, 主要是您可能也听说过 术语签名, 函数签名就是这样｡
它指定返回的数据, 它获取的数据以及函数本身的一切｡
您要编写函数原型 与编写函数头的方式相同, 唯一的区别是
你在结尾加了个分号｡
而这只是 声明函数｡
这表示函数存在｡
函数原型支持 编译器在每个
调用函数的位置｡
它还会检查您是否正在使用 在每次调用中正确运行｡
您提供函数的原因 标头是为了使您可以在不发出警告或 函数声明,
而不实现它, 所以它实际上只是 代码的顺序,
我马上给你们举一个例子
当您包含标准信头时 文件时,
头文件将添加函数原型｡
函数原型通常 头文件（如果您希望在许多不同的源文件中重复使用它们）｡
如果您只在单个 源文件中,
只需将它们放在源文件中的顶部即可｡
但因为我们使用printf 可以在许多不同的源文件中使用的函数,
头文件 函数将在头文件或该函数声明中定义
将在标头中定义｡
在本例中, 是stdio｡ h.工作人员
所以它们通常出现在 如果只有该源文件正在使用该函数, 则为源文件｡
否则, 你就把它们放在一个
头文件（如果它们被许多源文件重用）｡
它允许使用 文件来调用定义的任何函数, 而不管这些函数在何处
您已经放置了实现｡
如果将实现 调用函数后, c会抱怨说
它并不知道这件事｡
因为当您编译时, 您需要逐行编译｡
如果将声明放在 然后在函数定义之前调用它
在实施之前｡
参数名不必是 与函数定义中使用的相同｡
您可以使用不同的名称｡
当我说名字的时候 数据的标识符｡
您可以更改 函数原型中的参数｡
您仍然必须拥有相同的数据 类型, 但您可以变更名称｡
最好的做法是
包括所有函数的函数声明 程序｡
它使您的程序更加一致
并防止在任何阶段发生任何错误 如果您想在实现该函数之前调用它｡
这是一个 一些函数原型｡
在最顶端的 文件, 我们有了包含文件｡
然后我们有一些 函数, 求平均值, 求和,
获取数据｡
你注意到了吗 如函数头｡
它具有返回类型､
具有在函数中定义的参数, 但是 它的结尾有一个分号｡
没有实现 用于这些功能｡
你只是告诉编译器 这是函数exist, 这是它的定义.
这让你现在可以 在主函数中,
你可以调用平均值, 你可以调用 您可以呼叫以取得数据｡
并且实际的实现可以 在你召唤它们的地方下面｡
如果你没有这个功能
标头, 当您尝试在主目录中调用它们时, 如果它们 定义在主例程下面, 则会出现错误或警告｡
让我们来看看 在in编码块处｡
这里我们有我们通常的主要程序｡
现在假设我们想要 创建一个函数或者调用一个函数｡
我们将调用 函数调用add, 它不带任何参数｡
我们把它称为 第7行上的main函数｡
我们要 在第10行实现它｡
我们会说void add和 我们什么都不做｡
我们要让它空着｡
当我们编译这个时 你会注意到这个编译器只是给出了一个警告｡
它说add有一个 隐式声明｡
你可以把那个警告去掉 通过使用函数声明｡
您可以声明函数 基本上就是告诉编译器 在某个地方使用它,
但不知道实现在哪里｡
所以你能做的就是 在这里输入void add然后加上分号｡
现在它将摆脱那种 警告, 有些编译实际上会给予你一个错误｡
当我编译它的时候 没有警告和错误｡
这就是函数 声明会执行此操作｡
它允许您将 函数｡
如果你没有这个函数 声明, 而上面的实现
调用它,
那么您也不会看到错误, 因为编译器 会在实际调用函数之前知道它｡
所以如果我们建造这个, 你也 检查是否存在错误｡
我提到过你通常
我想在顶部声明所有的函数, 只是为了更好地练习 我觉得你确实需要这么做｡
所以继续这样做｡
但如果你真的逃出来了 习惯,
要么在调用函数之前声明它们
或者您必须提供函数原型, 因为您不希望 警告或错误｡
这就是如何定义 函数, 这就是如何使用函数原型｡
下节课, 我们会讨论参数｡
如何将数据传递给函数｡
-谢谢—谢谢