1414
1515## 算术运算符
1616
17- 算术运算符是 C++ 中用于进行基本数学运算的符号
17+ 算术运算符是 C++ 中用于执行基本数学运算的符号,仅支持数值类型的操作数。
1818
1919| 运算符| 说明|
2020| :---:| :---:|
21- | +| 加法|
22- | -| 减法|
23- | * | 乘法|
24- | /| 除法|
25- | %| 取余|
21+ | +| 加法,计算两个操作数的和 |
22+ | -| 减法,计算两个操作数的差 |
23+ | * | 乘法,计算两个操作数的积 |
24+ | /| 除法,计算两个操作数的商 |
25+ | %| 取余(取模),计算两个整数相除的余数 |
2626
2727``` CPP
2828int a{10};
@@ -35,11 +35,22 @@ int f{a / b}; // 3(整数除法)
3535int 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   ; = & nbsp ; a   ; +   ; b|
80+ | -=| a   ; -=   ; b| a   ; = & nbsp ; a   ; -   ; b|
81+ | * =| a   ; * =   ; b| a   ; = & nbsp ; a   ; *   ; b|
82+ | /=| a   ; /=   ; b| a   ; = & nbsp ; a   ; /   ; b|
83+ | %=| a   ; %=   ; b| a   ; = & nbsp ; a   ; %   ; b|
6184
6285``` CPP
6386int 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
106128int a{10};
107129int 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
111133bool 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
130161int 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
139172int 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