Skip to content

Commit b167d6b

Browse files
committed
Optimize Article
1 parent 9523e34 commit b167d6b

1 file changed

Lines changed: 75 additions & 43 deletions

File tree

source/Language Core/Chapter-2/Section-06.md

Lines changed: 75 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414

1515
## 算术运算符
1616

17-
算术运算符是 C++ 中用于进行基本数学运算的符号
17+
算术运算符是 C++ 中用于执行基本数学运算的符号,仅支持数值类型的操作数。
1818

1919
|运算符|说明|
2020
|:---:|:---:|
21-
|+|加法|
22-
|-|减法|
23-
|*|乘法|
24-
|/|除法|
25-
|%|取余|
21+
|+|加法,计算两个操作数的和|
22+
|-|减法,计算两个操作数的差|
23+
|*|乘法,计算两个操作数的积|
24+
|/|除法,计算两个操作数的商|
25+
|%|取余(取模),计算两个整数相除的余数|
2626

2727
```CPP
2828
int a{10};
@@ -35,11 +35,22 @@ int f{a / b}; // 3(整数除法)
3535
int g{a % b}; // 1
3636
```
3737
38-
当两个整数进行除法运算时,结果仍然是整数,小数部分会被直接丢弃。
38+
当两个整数进行除法运算时,结果仍为整数,C++11 起明确规定整数除法向零取整,即直接丢弃小数部分。
39+
40+
```Text
41+
正数除法: 10 / 3 = 3
42+
负数除法: -10 / 3 = -3(而非向负无穷取整的-4)
43+
```
44+
45+
若需要保留小数,需保证至少一个操作数为浮点数(如10.0 / 3、10 / 3.0),此时执行浮点数除法,结果为3.333...。
46+
47+
除法运算中,除数为 0 属于未定义行为,会直接导致程序崩溃,开发中必须提前判断除数是否为 0。
48+
49+
取余运算符%仅支持整数类型操作数,浮点数使用%会直接编译报错;取余结果的符号与被除数一致,如-10 % 3 = -1,10 % -3 = 1。
3950

4051
## 赋值运算符
4152

42-
用于给变量进行赋值的符号
53+
赋值运算符用于对已创建的变量进行赋值操作,即将右侧的值覆盖到左侧的变量中。赋值运算符的左值必须是可修改的 (不能是常量、字面量)。
4354

4455
### 基本赋值运算符
4556

@@ -49,26 +60,38 @@ int g{a % b}; // 1
4960
|:---:|:---:|:---:|
5061
|=|a   =   15;|将右侧数据赋值给左侧变量|
5162

63+
很多初学者会混淆初始化与赋值,二者是 C++ 中完全不同的操作:
64+
65+
初始化: 变量创建时赋予初始值,如int   a{15};、int   a   =   15;,整个生命周期仅执行一次;{}是 C++11 引入的列表初始化语法,仅用于初始化,可避免隐式缩窄转换,相对于 = 初始化更安全。
66+
67+
赋值: 变量已创建完成后,修改其值,如a = 20;,可在变量生命周期内多次执行。
68+
69+
```{attention}
70+
{ } 仅能在变量/常量初始化时使用,对已存在的变量执行重复赋值会直接编译报错。
71+
```
72+
5273
### 复合赋值运算符
5374

75+
复合赋值运算符是「算术运算 + 赋值」的简写形式,可简化代码,同时避免重复计算。
76+
5477
|运算符|示例|等价写法|
5578
|:---:|:---:|:---:|
56-
|+=|a   +=   b|a  {a   +   b}|
57-
|-=|a   -=   b|a  {a   -   b}|
58-
|*=|a   *=   b|a  {a   *   b}|
59-
|/=|a   /=   b|a  {a   /   b}|
60-
|%=|a   %=   b|a  {a   %   b}|
79+
|+=|a   +=   b|a   =   a   +   b|
80+
|-=|a   -=   b|a   =   a   -   b|
81+
|*=|a   *=   b|a   =   a   *   b|
82+
|/=|a   /=   b|a   =   a   /   b|
83+
|%=|a   %=   b|a   =   a   %   b|
6184

6285
```CPP
6386
int a{10};
6487

65-
a += 5; // 15
66-
a *= 2; // 30
88+
a += 5; // 等价于 a = a + 5; 执行后a=15
89+
a *= 2; // 等价于 a = a * 2; 执行后a=30
6790
```
6891
6992
## 比较运算符
7093
71-
常用于在逻辑运算或条件判断中比较两个值的大小关系,结果为布尔值(true 或 false)。
94+
比较运算符用于在逻辑运算或条件判断中,比较两个值的大小 / 相等关系,运算结果为布尔值(true 或 false)。
7295
7396
|运算符|说明|
7497
|:---:|:---:|
@@ -88,13 +111,12 @@ bool r2{a < b}; // a 小于 b 结果为 true
88111
```
89112

90113
```{attention}
91-
在 C++ 11 之前我们常使用 '=' 为变量进行赋值,许多初学者会将 '=' 和 '==' 混淆这是最常见的初学者错误之一。
92-
因此我们在进行变了赋值的时候应尽可能的使用 '{}' 符号。
114+
在 C++ 11 之前我们常使用 '=' 为变量进行赋值,许多初学者会将 '=' 和 '==' 混淆这是初学者最常见的错误之一。
93115
```
94116

95117
## 逻辑运算符
96118

97-
常用于条件判断或用于组合多个条件表达式
119+
逻辑运算符用于组合多个条件表达式,实现复杂的逻辑判断,运算结果为布尔值
98120

99121
|运算符|说明|
100122
|:---:|:---:|
@@ -106,12 +128,19 @@ bool r2{a < b}; // a 小于 b 结果为 true
106128
int a{10};
107129
int b{20};
108130

109-
bool r{a < b && b > 0}; // a 小于 b 且 b 大于 0 结果为 true
110-
bool r{a < b || b > 100}; // a 小于 b 左侧条件成立 结果为 true
131+
bool r1{a < b && b > 0}; // a 小于 b 且 b 大于 0 结果为 true
132+
bool r2{a < b || b > 100}; // a 小于 b 左侧条件成立 结果为 true
111133
bool r3{!(a < b)}; // a 小于 b 取反 结果为 false
112134
```
113135
114-
逻辑运算符具有“短路特性”,当结果已经确定时,后续表达式不会执行。
136+
逻辑运算符会将所有操作数隐式转换为bool类型:非 0 值转为true,0 转为false。例如5 && 0的结果为false,!0的结果为true。
137+
138+
```{attention}
139+
逻辑运算符具有严格的短路特性,当左侧操作数已经能确定整个表达式的结果时,右侧的表达式不会执行:
140+
141+
- && 短路:左操作数为false时,直接确定结果为false,右侧表达式不执行;
142+
- || 短路:左操作数为true时,直接确定结果为true,右侧表达式不执行。
143+
```
115144

116145
## 自增减运算符
117146

@@ -126,20 +155,24 @@ bool r3{!(a < b)}; // a 小于 b 取反 结果为 false
126155

127156
### 前置自增 / 前置自减
128157

158+
前置运算符的执行规则是先修改,再使用:先对变量执行 + 1/-1 操作,再返回修改后的变量本身(结果为左值)。
159+
129160
```CPP
130161
int x{10};
131162

132-
int y{++x}; // x = 11,y = 11
133-
int z{--x}; // x = 10, z = 10
163+
int y{++x}; // 先将x+1(x变为11),再将x的值赋值给y,最终x=11,y=11
164+
int z{--x}; // 先将x-1(x变为10),再将x的值赋值给z,最终x=10,z=10
134165
```
135166
136167
### 后置自增 / 后置自减
137168
169+
后置运算符的执行规则是先使用,再修改:先返回变量修改前的原始值(结果为右值,会产生临时对象),再对变量执行 + 1/-1 操作。
170+
138171
```CPP
139172
int x{10};
140173
141-
int y{x++}; // y = 10,x = 11
142-
int z{x--}; // z = 11,x = 10
174+
int y{x++}; // 先将x的原始值10赋值给y,再将x+1,最终y=10,x=11
175+
int z{x--}; // 先将x的原始值11赋值给z,再将x-1,最终z=11,x=10
143176
```
144177

145178
```{attention}
@@ -172,27 +205,26 @@ int x{(10 + 5) * 2}; // 30
172205

173206
在 C++ 中括号的优先级最高,建议在复杂表达式中使用括号来明确运算顺序。
174207

175-
优先级(高 ---> 低):
176-
177-
```TEXT
178-
()
179-
> ++ --
180-
> * / %
181-
> + -
182-
> < <= > >=
183-
> == !=
184-
> &&
185-
> ||
186-
> = += -= ...
187-
```
208+
| 优先级 | 运算符 | 说明 | 结合性 |
209+
|:---:|:---:|:---:|:---:|
210+
| 1 | `()` | 括号 | 左结合 |
211+
| 1 | `++` `--` | 后置自增、后置自减 | 左结合 |
212+
| 2 | `!` | 逻辑非 | 右结合 |
213+
| 2 | `++` `--` | 前置自增、前置自减 | 右结合 |
214+
| 3 | `*` `/` `%` | 乘法、除法、取余 | 左结合 |
215+
| 4 | `+` `-` | 加法、减法 | 左结合 |
216+
| 5 | `<` `<=` `>` `>=` | 小于、小于等于、大于、大于等于 | 左结合 |
217+
| 6 | `==` `!=` | 等于、不等于 | 左结合 |
218+
| 7 | `&&` | 逻辑与 | 左结合 |
219+
| 8 | `\|\|` | 逻辑或 | 左结合 |
220+
| 9 | `=` `+=` `-=` `*=` `/=` `%=` | 赋值、复合赋值 | 右结合 |
188221

189222
记忆规则:
190223

191224
算术 > 比较 > 逻辑 > 赋值
192225

193226
使用建议:
194227

195-
- 能加括号就加括号
196-
- 不依赖记忆优先级写代码
197-
- 复杂表达式尽量拆分
198-
- 优先保证代码可读性
228+
- 不确定优先级时,直接使用括号明确运算顺序,避免依赖记忆编写代码;
229+
- 复杂表达式尽量拆分为多行,优先保证代码的可读性;
230+
- 避免过度嵌套运算符,减少代码的理解成本。

0 commit comments

Comments
 (0)