Skip to content

Commit 79cca33

Browse files
authored
Merge pull request #32 from Mq-b/Mq-b-dev
修改与补充函数一节的内容
2 parents a133f8f + f5cbb02 commit 79cca33

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

docs/functions.md

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ TODO: println 参数演示
1212

1313
## 函数的返回值
1414

15-
函数可以没有返回值,只需要返回类型写 `void` 即可,这样的函数调用的目的只是为了他的副作用(如修改全局变量,输出文本到控制台,修改引用参数等)。
15+
函数可以没有返回值,只需要声明函数时返回类型声明为 `void` 即可,调用这样的函数只是为了他的副作用(如修改全局变量,输出文本到控制台,修改引用参数等)。
1616

1717
```cpp
1818
void compute()
@@ -22,19 +22,62 @@ void compute()
2222
```
2323

2424
> {{ icon.tip }} 对于没有返回值(返回类型为 `void`)的函数,可以省略 `return` 不写。
25+
2526
```cpp
2627
void compute()
2728
{
2829
// 没问题
2930
}
3031
```
3132

32-
> {{ icon.warn }} 对于有返回值的函数,必须写 return 语句,如果漏写,会出现可怕的未定义行为 (undefined behaviour)。编译器不会报错,而是到运行时才出现崩溃等现象,建议 GCC 用户开启 `-Werror=return-type` 让编译器检测此类错误。更多未定义行为可以看我们的[未定义行为列表](undef.md)章节。
33+
> {{ icon.warn }} 对于返回类型不为 `void` 的函数,必须写 `return` 语句,如果漏写,会出现可怕的未定义行为 (undefined behaviour)。编译器不一定会报错,而是到运行时才出现崩溃等现象。建议 GCC 用户开启 `-Werror=return-type` 让编译器在编译时就检测此类错误,MSVC 则是开启 `/we4716`。更多未定义行为可以看我们的[未定义行为列表](undef.md)章节。
34+
> {{ icon.detail }} 但有两个例外:1. main 函数是特殊的可以不写 return 语句,默认会自动帮你 `return 0;`。2. 具有 co_return 或 co_await 的协程函数可以不写 return 语句。
3335
3436
### 接住返回值
3537

3638
### 返回类型 `auto`
3739

40+
C++11 `auto` 可以用作函数的返回类型,但它只是一个**占位**,让我们得以后置返回类型。
41+
42+
```cpp
43+
auto f() -> int;
44+
// 等价于:
45+
int f();
46+
```
47+
48+
C++14 引入了函数**返回类型推导**`auto` 才算真正意义上的用做了函数返回类型,它会根据函数中的 `return` 表达式推导出函数的返回类型。
49+
50+
```cpp
51+
int x = 1;
52+
auto f() {
53+
return x;
54+
}
55+
// 等价于:
56+
int f() {
57+
return x;
58+
}
59+
60+
// 如果函数中没有return语句,那么 `auto` 会被自动推导为 `void`
61+
auto f() {
62+
std::println("hello");
63+
}
64+
// 等价于:
65+
void f() {
66+
std::println("hello");
67+
}
68+
69+
// 值得注意的是,返回类型用 `auto` 来推导的函数,如果有多条 `return` 语句,那么他们必须是相同的类型;否则报错
70+
auto f(int x) {
71+
if (x > 0) {
72+
return 1; // int
73+
} else {
74+
return 3.14; // double
75+
}
76+
} // 错误:有歧义,无法确定 auto 应该推导为 int 还是 double
77+
```
78+
79+
<!-- decltype(auto)... -->
80+
3881
## 函数的参数
3982
4083
### 形参 vs 实参

0 commit comments

Comments
 (0)