基本运算符¶
在 C++ 中,运算符用于对数据进行各种操作,例如计算、比较、逻辑判断等。
运算符通常作用于一个或多个操作数,并返回一个结果。
常见的运算符主要包括:
算术运算符
赋值运算符
比较运算符
逻辑运算符
自增 / 自减运算符
算术运算符¶
算术运算符是 C++ 中用于执行基本数学运算的符号,仅支持数值类型的操作数。
运算符 |
说明 |
|---|---|
+ |
加法,计算两个操作数的和 |
- |
减法,计算两个操作数的差 |
* |
乘法,计算两个操作数的积 |
/ |
除法,计算两个操作数的商 |
% |
取余(取模),计算两个整数相除的余数 |
int a{10};
int b{3};
int c{a + b}; // 13
int d{a - b}; // 7
int e{a * b}; // 30
int f{a / b}; // 3(整数除法)
int g{a % b}; // 1
当两个整数进行除法运算时,结果仍为整数,C++11 起明确规定整数除法向零取整,即直接丢弃小数部分。
正数除法: 10 / 3 = 3
负数除法: -10 / 3 = -3(而非向负无穷取整的-4)
若需要保留小数,需保证至少一个操作数为浮点数(如10.0 / 3、10 / 3.0),此时执行浮点数除法,结果为3.333…。
除法运算中,除数为 0 属于未定义行为,会直接导致程序崩溃,开发中必须提前判断除数是否为 0。
取余运算符%仅支持整数类型操作数,浮点数使用%会直接编译报错;取余结果的符号与被除数一致,如-10 % 3 = -1,10 % -3 = 1。
赋值运算符¶
赋值运算符用于对已创建的变量进行赋值操作,即将右侧的值覆盖到左侧的变量中。赋值运算符的左值必须是可修改的 (不能是常量、字面量)。
基本赋值运算符¶
用于将数据赋值给变量。
运算符 |
示例 |
说明 |
|---|---|---|
= |
a = 15; |
将右侧数据赋值给左侧变量 |
很多初学者会混淆初始化与赋值,二者是 C++ 中完全不同的操作:
初始化: 变量创建时赋予初始值,如int a{15};、int a = 15;,整个生命周期仅执行一次;{}是 C++11 引入的列表初始化语法,仅用于初始化,可避免隐式缩窄转换,相对于 = 初始化更安全。
赋值: 变量已创建完成后,修改其值,如a = 20;,可在变量生命周期内多次执行。
注意
{ } 仅能在变量/常量初始化时使用,对已存在的变量执行重复赋值会直接编译报错。
复合赋值运算符¶
复合赋值运算符是「算术运算 + 赋值」的简写形式,可简化代码,同时避免重复计算。
运算符 |
示例 |
等价写法 |
|---|---|---|
+= |
a += b |
a = a + b |
-= |
a -= b |
a = a - b |
*= |
a *= b |
a = a * b |
/= |
a /= b |
a = a / b |
%= |
a %= b |
a = a % b |
int a{10};
a += 5; // 等价于 a = a + 5; 执行后a=15
a *= 2; // 等价于 a = a * 2; 执行后a=30
比较运算符¶
比较运算符用于在逻辑运算或条件判断中,比较两个值的大小 / 相等关系,运算结果为布尔值(true 真 或 false 假)。
运算符 |
说明 |
|---|---|
== |
等等于: 检查两个值是否相等。如果相等,则条件为真(true),否则为假(false) |
!= |
不等于: 检查两个值是否不相等。如果不相等,则条件为真(true),否则为假(false) |
> |
大于: 检查左侧的值是否⼤于右侧的值。如果是,则条件为真(true),否则为假(false) |
< |
小于: 检查左侧的值是否⼩于右侧的值。如果是,则条件为真(true),否则为假(false) |
>= |
大于等于: 检查左侧的值是否⼤于或等于右侧的值。如果是,则条件为真(true),否则为假(false) |
<= |
小于等于: 检查左侧的值是否⼩于或等于右侧的值。如果是,则条件为真(true),否则为假(false) |
int a{10};
int b{20};
bool r1{a == b}; // a 不等于 b 结果为 false
bool r2{a < b}; // a 小于 b 结果为 true
注意
在 C++ 11 之前我们常使用 ‘=’ 为变量进行赋值,许多初学者会将 ‘=’ 和 ‘==’ 混淆这是初学者最常见的错误之一。
逻辑运算符¶
逻辑运算符用于组合多个条件表达式,实现复杂的逻辑判断,运算结果为布尔值。
运算符 |
说明 |
|---|---|
&& |
逻辑与(且): 当所有条件都为真时,结果为真,否则为假 |
|| |
逻辑或: 当任意⼀个语句为真,则结果为真,所有语句都为假时,结果为假 |
! |
逻辑非(取反): ⽤于取反逻辑状态,真变假,假变真 |
int a{10};
int b{20};
bool r1{a < b && b > 0}; // a 小于 b 且 b 大于 0 结果为 true
bool r2{a < b || b > 100}; // a 小于 b 左侧条件成立 结果为 true
bool r3{!(a < b)}; // a 小于 b 取反 结果为 false
逻辑运算符会将所有操作数隐式转换为bool类型:非 0 值转为true,0 转为false。例如5 && 0的结果为false,!0的结果为true。
注意
逻辑运算符具有严格的短路特性,当左侧操作数已经能确定整个表达式的结果时,右侧的表达式不会执行:
&& 短路:左操作数为false时,直接确定结果为false,右侧表达式不执行;
|| 短路:左操作数为true时,直接确定结果为true,右侧表达式不执行。
自增减运算符¶
用于对变量进行自加或自减操作。
运算符 |
说明 |
|---|---|
|
自增 |
|
自减 |
自增与自减分为前置自增和后置自增自减也分为前置自减和后置自减。
前置自增 / 前置自减¶
前置运算符的执行规则是先修改,再使用:先对变量执行 + 1/-1 操作,再返回修改后的变量本身(结果为左值)。
int x{10};
int y{++x}; // 先将x+1(x变为11),再将x的值赋值给y,最终x=11,y=11
int z{--x}; // 先将x-1(x变为10),再将x的值赋值给z,最终x=10,z=10
后置自增 / 后置自减¶
后置运算符的执行规则是先使用,再修改:先返回变量修改前的原始值(结果为右值,会产生临时对象),再对变量执行 + 1/-1 操作。
int x{10};
int y{x++}; // 先将x的原始值10赋值给y,再将x+1,最终y=10,x=11
int z{x--}; // 先将x的原始值11赋值给z,再将x-1,最终z=11,x=10
注意
前置运算符是“先修改再使用”,后置运算符是“先使用再修改”。
运算符优先级¶
当一个表达式中包含多个运算符时,编译器需要根据一定的规则来决定运算顺序,这个规则称为 运算符优先级。运算符优先级决定了应该“先算谁,后算谁”。
int x{10 + 5 * 2}; // 20
/* 执行顺序
* 5 * 2 = 10
* 10 + 10 = 20
*/
若你想让某个数据优先进行计算可以使用括号改变优先级
int x{(10 + 5) * 2}; // 30
/* 执行顺序
* 10 + 5 = 15
* 15 * 2 = 30
*/
在 C++ 中括号的优先级最高,建议在复杂表达式中使用括号来明确运算顺序。
优先级 |
运算符 |
说明 |
结合性 |
|---|---|---|---|
1 |
|
括号 |
左结合 |
1 |
|
后置自增、后置自减 |
左结合 |
2 |
|
逻辑非 |
右结合 |
2 |
|
前置自增、前置自减 |
右结合 |
3 |
|
乘法、除法、取余 |
左结合 |
4 |
|
加法、减法 |
左结合 |
5 |
|
小于、小于等于、大于、大于等于 |
左结合 |
6 |
|
等于、不等于 |
左结合 |
7 |
|
逻辑与 |
左结合 |
8 |
|
逻辑或 |
左结合 |
9 |
|
赋值、复合赋值 |
右结合 |
记忆规则:
算术 > 比较 > 逻辑 > 赋值
使用建议:
不确定优先级时,直接使用括号明确运算顺序,避免依赖记忆编写代码;
复杂表达式尽量拆分为多行,优先保证代码的可读性;
避免过度嵌套运算符,减少代码的理解成本。