1414
1515函数的创建和使用会分为三个步骤:
1616
17- * 函数原型 ( function type ):这个是创建函数定义,也叫函数清单 ,能够表明一个文件中有哪些函数。
17+ * 函数原型 ( function type ):这个是创建函数定义,也叫函数声明 ,能够表明一个文件中有哪些函数。
1818* 函数调用 ( function call ):调用函数的位置,函数被定义出来肯定是要使用它的,在哪里使用的这个函数就被称为函数调用。
1919* 函数定义 ( function definition ):这个就是函数的具体要干的什么事儿,也就是函数的具体逻辑是什么。
2020
@@ -137,7 +137,9 @@ void sum(int a,int b){
137137
138138
139139
140- 当然并不是所有的函数都需要返回值,而且 return 语句后面也不一定需要表达式,当 return 语句后面没有表达式时,函数不会向调用者返回值。返回值通过
140+
141+
142+ 当然并不是所有的函数都需要返回值,而且 return 语句后面也不一定需要表达式,当 return 语句后面没有表达式时,函数不会向调用者返回值。返回值会通过
141143
142144```c
143145return 表达式
@@ -156,7 +158,7 @@ int sum(int a,int b){
156158
157159可以看到,sum 函数的表达式返回了 a + b,这其实就是一个表达式。而我们可以看到上面的 int main 方法,它的返回值是 0 ,这就是返回了一个常量。
158160
159- return 后面可以不返回任何值,只是单独写一个 return 也是 C 允许,这种方式相当于没有返回任何值 ,所以它的函数类型可以定义为 void ,如下代码所示
161+ return 后面可以不返回任何值,只是单独写一个 return 也是允许的,不过这种方式相当于没有返回任何值 ,所以它的函数类型可以定义为 void ,如下代码所示:
160162
161163```c
162164// 函数定义
@@ -169,9 +171,42 @@ void sum(int a,int b){
169171}
170172```
171173
174+ 使用 return 语句的另外一个作用是终止函数的执行,强制把控制返回给调用函数,如下代码所示:
175+
176+ ``` c
177+ // 函数定义
178+ int sum (int a,int b){
179+
180+ int sumAll = a + b;
181+ printf("sumAll = %d\n",sumAll);
182+
183+ if(a + b > 0){
184+ return sumAll;
185+ }else{
186+ return 0;
187+ }
188+ }
189+ ```
190+
191+ 如果 a + b 的值大于 0 的话,会直接返回 a + b 的和,否则为 0 。这个 if 的控制流程就是强制把结果返回给函数调用者。如果在 if 控制流程后面添加代码的话,那么这段代码不会执行,但是编译却没有给出警告。
192+
193+ 
194+
195+ 在 Java 编辑器中,如果最后一行代码出现在 return 强制返回后面的话,编译器会给出警告或者错误提示这行代码不会被执行。
196+
197+ ### 函数类型
198+
199+ 这里需要再强调一下函数类型,定义函数的时候需要声明函数的类型,带返回值的函数类型与返回值类型相同,没有返回值的函数应该将其定义为 void 类型。在老版本的 C 编译器中,如果你没有声明函数类型,编译器会默认把函数当做 int 类型来处理,不过这都是早期的事儿了,现在 C 标准不再支持默认函数为 int 类型这种情况。
200+
201+ 在编写函数的时候,你就需要考虑好函数的具体功能是什么,也就是这个函数做了哪些事情,需不需要返回值,如果需要返回值的话,它的返回类型是什么。
202+
203+ ### 函数声明
172204
205+ 如果大家学过 Java ,可能对 C 这种先声明再定义的方式很不习惯,为什么函数在定义前需要再单独声明一下呢?我直接定义函数不声明行吗?答案肯定是不行的。
173206
207+ 这个先声明再使用一直是 C 语言的标准,标准没有为什么,这就是一个标准,但是这个标准却是一个历史遗留问题。
174208
209+ 上世纪 70 年代,大部分计算机内存很小,处理速度也比较差,所以导致代码的运行时间很长,效率很差,这时候进行我们就需要考虑内存占用和编译时间的问题。因为 C 语言开发的比较早,而且 C 又是和硬件直接打交道的,所以提前声明一下函数能够提前分配内存空间,
175210
176211
177212
0 commit comments