File tree 3 files changed +37
-1
lines changed 3 files changed +37
-1
lines changed Original file line number Diff line number Diff line change
1
+ # 重新认识声明与定义
2
+
3
+ > {{ icon.fun }} mq 白在[ 川上] ( https://github.com/parallel101/cppguidebook/pull/23 ) 曰:
4
+ >
5
+ > 非定义声明,因为 Game 在此处为不完整类型
6
+ >
7
+ > 我能明白其意思,定义一定是声明,声明却不一定是定义。所以用了:“非定义声明”这个词语,很专业的措辞。
8
+ >
9
+ > 不过我觉得大多数普通开发者并不够清楚这一点,看到这段注释同样会感到疑惑。
10
+ >
11
+ > 在他们眼里声明和定义是两种东西,此处如果直接用声明它们可能就不会有理解问题了。例如:“只是声明,不是定义”之类的措辞。
12
+ >
13
+ > 或许我们应该考虑在保证专业以及严谨的情况下,稍微补充解释一下“非定义声明”这个用词。
Original file line number Diff line number Diff line change @@ -286,15 +286,24 @@ int j = (++i) + (++i); // j 的值未定义
286
286
```
287
287
288
288
``` 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 ;
289
296
int j = (++i) + i; // j 的值未定义
290
297
```
291
298
292
299
``` cpp
293
300
int i1 = 5 ;
294
301
int i2 = 5 ;
295
- int j = (++i1) + (++i2); // j = 12
302
+ int j = (++i1) + (++i2); // 正确,j 会得到 12
296
303
```
297
304
305
+ > {{ icon.fun }} 转发给你身边的谭浩强受害者看(` i+++++i ` )。
306
+
298
307
### 内建类型的二元运算符,其左右两个参数求值的顺序是不确定的
299
308
300
309
在标准看来,+ 运算符两侧是“同时”求值的,即“interleaved”,实际执行顺序并不确定。
@@ -368,6 +377,19 @@ foo(f1(), f2()); // 可能打印 f1 f2,也可能打印 f2 f1
368
377
f1(); f2(); // 必然打印 f1 f2
369
378
```
370
379
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
+
371
393
## 函数类
372
394
373
395
### 返回类型不为 void 的函数,必须有 return 语句
Original file line number Diff line number Diff line change 10
10
- platform.md
11
11
- variable_types.md
12
12
- functions.md
13
+ - symbols.md
13
14
- cpp_tricks.md
14
15
- lambda.md
15
16
- type_rich_api.md
You can’t perform that action at this time.
0 commit comments