服装网站模板,山西网站设计,wordpress启用注册,一条龙搭建网站转载知呼大佬06 - C函数 - 知乎 (zhihu.com)
06 - C函数 本期我们讨论的是 C 中的函数。
函数到底是什么呢#xff0c;函数就是我们写的代码块#xff0c;被设计用来执行特定的任务#xff0c;以后我们学习 class 类的时候#xff0c;这些块会被称为方法#xff0c;但是…
转载知呼大佬06 - C函数 - 知乎 (zhihu.com)
06 - C函数 本期我们讨论的是 C 中的函数。
函数到底是什么呢函数就是我们写的代码块被设计用来执行特定的任务以后我们学习 class 类的时候这些块会被称为方法但是当我说到函数时我们讲的可不是 C 类里面的 方法。
01 函数能干什么
对我们来说使用函数是很常见的避免代码重复。我们不想重复写相同的代码当然如果我们也可以复制和粘贴很多代码但会导致巨大的混乱这也意味着如果我们决定改变一些代码我们必须在所有这些地方改变它我们粘贴的地方那维护这些代码简直就是灾难所以我们把我们要做的事情写成一个函数然后可以多次调用它。
如果需要的话你可以认为函数有一个输入一个输出尽管他们可能并不需要这么做。我们可以为函数提供一定的参数函数可以为我们返回值。
02 定义函数
假设我们想把两个数相乘我们想写出这样的一个函数。 我们对上面的代码做一些详细的解释。
首先写的是所谓的返回值 int也就是说这就是这个函数的返回类型因为是两个整数相乘这当然会得到一个整数 然后给出函数名 multiply 它有两个参数 a 和 b 这些就是我们要乘的数它们的类型都是 int。然后给出函数体它会返回 a*b 。
这样你就得到一个函数它有两个都是整数的参数该函数的功能是返回两者的乘积。
我们不一定非要提供参数例如我可以不提供任何参数直接返回 5*8 这仍然是一个返回整数的函数但它没任何参数。 我们也可以让函数不返回任何东西我们通过写 void 作为返回类型来实现void 意思是啥也没有所以我们可以这样做。 03 调用函数
如何调用这个函数呢调用一个函数非常简单我们直接看下面的例子。 对上面的代码我们做一些解释。
首先我们定义了一个变量 result来装这个结果然后直接写函数的名字加括号就可以完成调用函数括号里面的数字就是函数需要的两个参数返回值 result 保存 a*b 的结果最后我们将结果输出到控制台。按 F5 来运行程序你可以看到我们得到显示是6也就是2乘以3的结果。
04 为什么要用函数
所以为什么要用函数呢看起来代码还更多了一些。
让我们把情况说的更详细些假设我要做一堆的乘法我想把它们都记录到控制台在没有函数的情况下下面的情况这样看起来会很乱。 如果你运行了这些代码你会发现我犯了一些错误我想说的是其实这种情况经常发生。人们复制和粘贴代码块 然后忘记改变一个小细节在某些情况下程序如果正常运行的话你就有可能注意不到直到它在某个地方出错了你才会知道。
你不会还没发现错在哪里吧
让我们修正这些代码。 这样我们会得到正确的结果。
上面的多段代码大部分内容基本差不多基本的区别就是参与乘法的数字不同。这就很难受了。
让我们为这个重复的过程创建一个函数。
先分析一下具体的需求。这个函数应该不需要返回值它只需要输出一些信息这个函数需要两个参数就可以完成每段代码中不同的部分为了直观的联想到函数的功能函数的名字就叫做 MultiplyAndLog 吧然后我们就有了下面这个函数。 函数定义好后我们要做的就是调用这个函数。 如果启动这个程序 你可以看到在这里可以获得正确的值这是一个很简单的例子我们获得了一个非常干净、易于阅读的程序。
通过以上给分析过程我们有效地证明了函数是真的非常重要的。你的目标应该是将你的代码分开成很多函数。
然而 有一件事我想强调也不要把你的代码每一行都拆成函数对任何人都没有好处的代码这很难维护您的代码将看起来凌乱不堪它会让你的程序变慢。
原因是每次我们调用函数时编译器生成一个call 指令这基本上意味着在一个运行的程序中我们需要创建一个堆栈结构这意味着我们必须把像参数这样的东西推进堆栈我们还需要将一个叫做返回地址的东西然后我们要做的是跳到二进制执行文件的不同部分以便开始执行我们的函数指令。为了将 push 进去的结果返回我们得回去到最初调用函数之前。就像在内存中跳跃来执行函数跳跃和执行这些都需要时间这些会减慢我们的程序。当然前提是保持我们当前的函数是作为一个实际的函数而不是做内联inline的工作我们会在未来深入讨论内联。
我说这些都是因为不想让你们对于每一行代码都去创建函数不要做那么搞笑的事情编码多了你才能明白哪里你会需要一个函数但基本上如果你看到自己在多次做一项共同的任务那么基本可以为此创建一个函数函数的主要目的是防止代码重复我们不希望复制粘贴代码。
05 其他的
现在我们回到代码中有些小伙伴会发现一个细节main 函数需要返回 int 类型的值可是在 main 函数体中却找不到 return 关键字。这样操作是合理的吗
然我们做一个修改验证一些东西。 CtrlF7 编译我们得到了一个错误。 看起来有返回类型的函数的确必须有返回值。
原因是主函数实际上是一个特殊函数只有主函数被豁免可以不返回值它会自动假设你返回0。其他的函数必须要返回值。 main函数不写返回值的操作只是现代 C 和C 的一个特性可以让你代码保持的干净一点。
好了我们知道这必须返回一个值刚才讲的东西实际上 只适用于调试模式如果我们在release 模式下编译这里你会看到我们没有得到错误这并不是说我们现在做的是正确的因为如果我们真的要拿返回值值做某些事情的话我们会得到 “未定义的行为” 的报错信息只是编译器不会报错但是在调试模式下编译器就会显示出错。
后话
好了这是一个基本的函数介绍函数真的很有用。未来我还会写很多函数每个程序都是由一系列函数组成的所以这是非常重要的如果你不认为你完全理解函数是如何工作的不用担心 因为在这个系列中我们会写超级多的函数你会掌握它的最好的学习方法当然是多练习是吧。我们通常还将函数分解为声明和定义声明通常存储在头文件中我们在转换单元或 CPP 文件中编写定义我将专门制作关于头文件的一期在那里会讲到在头文件中函数如何声明。