Skip to content

Commit d042af3

Browse files
committed
finish
1 parent 7787f91 commit d042af3

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

docs/symbols.md

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# 重新认识声明与定义
2+
3+
> {{ icon.fun }} mq 白在[川上](https://github.com/parallel101/cppguidebook/pull/23)曰:
4+
>
5+
> 非定义声明,因为 Game 在此处为不完整类型
6+
>
7+
> 我能明白其意思,定义一定是声明,声明却不一定是定义。所以用了:“非定义声明”这个词语,很专业的措辞。
8+
>
9+
> 不过我觉得大多数普通开发者并不够清楚这一点,看到这段注释同样会感到疑惑。
10+
>
11+
> 在他们眼里声明和定义是两种东西,此处如果直接用声明它们可能就不会有理解问题了。例如:“只是声明,不是定义”之类的措辞。
12+
>
13+
> 或许我们应该考虑在保证专业以及严谨的情况下,稍微补充解释一下“非定义声明”这个用词。

docs/undef.md

+23-1
Original file line numberDiff line numberDiff line change
@@ -286,15 +286,24 @@ int j = (++i) + (++i); // j 的值未定义
286286
```
287287

288288
```cpp
289+
int i = 5;
290+
int a[10] = {};
291+
int j = a[i++] + a[i++]; // j 的值未定义
292+
```
293+
294+
```cpp
295+
int i = 5;
289296
int j = (++i) + i; // j 的值未定义
290297
```
291298

292299
```cpp
293300
int i1 = 5;
294301
int i2 = 5;
295-
int j = (++i1) + (++i2); // j = 12
302+
int j = (++i1) + (++i2); // 正确,j 会得到 12
296303
```
297304

305+
> {{ icon.fun }} 转发给你身边的谭浩强受害者看(`i+++++i`)。
306+
298307
### 内建类型的二元运算符,其左右两个参数求值的顺序是不确定的
299308

300309
在标准看来,+ 运算符两侧是“同时”求值的,即“interleaved”,实际执行顺序并不确定。
@@ -368,6 +377,19 @@ foo(f1(), f2()); // 可能打印 f1 f2,也可能打印 f2 f1
368377
f1(); f2(); // 必然打印 f1 f2
369378
```
370379

380+
不过,涉及自增的话,就还是未定义行为,而不是未指定了。
381+
382+
```cpp
383+
int i = 5;
384+
foo(i++, i++); // 会打印出什么?未定义行为
385+
```
386+
387+
```cpp
388+
int i = 5;
389+
int j = 5;
390+
foo(i++, j++); // 必然打印出 5 5
391+
```
392+
371393
## 函数类
372394

373395
### 返回类型不为 void 的函数,必须有 return 语句

mkdocs.yml

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ nav:
1010
- platform.md
1111
- variable_types.md
1212
- functions.md
13+
- symbols.md
1314
- cpp_tricks.md
1415
- lambda.md
1516
- type_rich_api.md

0 commit comments

Comments
 (0)