Skip to content

Commit b9286d8

Browse files
committed
Update c-function.md
1 parent beca1aa commit b9286d8

1 file changed

Lines changed: 38 additions & 3 deletions

File tree

cprograming/c-function.md

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
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
![image-20220627224608926](https://tva1.sinaimg.cn/large/e6c9d24ely1h3n6rc717rj2126088t9c.jpg)
139139
140-
当然并不是所有的函数都需要返回值,而且 return 语句后面也不一定需要表达式,当 return 语句后面没有表达式时,函数不会向调用者返回值。返回值通过
140+
141+
142+
当然并不是所有的函数都需要返回值,而且 return 语句后面也不一定需要表达式,当 return 语句后面没有表达式时,函数不会向调用者返回值。返回值会通过
141143
142144
```c
143145
return 表达式
@@ -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+
![image-20220628103557612](https://tva1.sinaimg.cn/large/e6c9d24egy1h3nr8i4202j20ci08wdg7.jpg)
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

Comments
 (0)