- C++
C++ 里,运算符优先级
- 2025-4-24 21:10:08 @
在 C++ 里,运算符优先级规定了表达式中运算符执行的先后顺序。下面将详细介绍常见运算符的优先级。
优先级顺序
C++ 运算符优先级从高到低大致可分为以下几个等级:
1. 括号类
- 括号
()
:用于改变表达式的运算顺序,具有最高优先级。在括号内的表达式会优先计算。
#include <iostream>
int main() {
int result = (2 + 3) * 4;
std::cout << result << std::endl;
return 0;
}
此例中,先计算括号内的 2 + 3
,再将结果乘以 4。
2. 一元运算符
- 逻辑非
!
:对操作数的逻辑值取反。 - 按位取反
~
:对操作数的每一个二进制位取反。 - 自增
++
和 自减--
:分为前置和后置,前置先改变变量的值再使用,后置先使用变量的值再改变。 - 正号
+
和 负号-
:表示数值的正负。
#include <iostream>
int main() {
int a = 5;
int b = -a;
int c = !a;
std::cout << b << " " << c << std::endl;
return 0;
}
这里,-a
取 a
的负值,!a
对 a
的逻辑值取反。
3. 算术运算符
- 乘法
*
、除法/
和 取模%
:这些运算符优先级相同,按照从左到右的顺序计算。 - 加法
+
和 减法-
:优先级低于乘除和取模,同样按从左到右的顺序计算。
#include <iostream>
int main() {
int result = 5 + 3 * 2;
std::cout << result << std::endl;
return 0;
}
此例中,先计算 3 * 2
,再将结果与 5 相加。
4. 移位运算符
- 左移
<<
和 右移>>
:将操作数的二进制位向左或向右移动指定的位数。
#include <iostream>
int main() {
int a = 5;
int b = a << 2;
std::cout << b << std::endl;
return 0;
}
这里,a
的二进制位向左移动 2 位。
5. 关系运算符
- 小于
<
、小于等于<=
、大于>
和 大于等于>=
:用于比较两个操作数的大小关系。 - 等于
==
和 不等于!=
:用于判断两个操作数是否相等。
#include <iostream>
int main() {
int a = 5;
int b = 3;
bool result = a > b;
std::cout << std::boolalpha << result << std::endl;
return 0;
}
此例中,比较 a
和 b
的大小。
6. 位运算符
- 按位与
&
:对两个操作数的对应二进制位进行与运算。 - 按位异或
^
:对两个操作数的对应二进制位进行异或运算。 - 按位或
|
:对两个操作数的对应二进制位进行或运算。
#include <iostream>
int main() {
int a = 5;
int b = 3;
int result = a & b;
std::cout << result << std::endl;
return 0;
}
这里,对 a
和 b
进行按位与运算。
7. 逻辑运算符
- 逻辑与
&&
:只有当两个操作数的逻辑值都为真时,结果才为真。 - 逻辑或
||
:只要两个操作数的逻辑值中有一个为真,结果就为真。
#include <iostream>
int main() {
int a = 5;
int b = 3;
bool result = (a > 0) && (b < 5);
std::cout << std::boolalpha << result << std::endl;
return 0;
}
此例中,使用逻辑与运算符判断两个条件是否同时成立。
8. 条件运算符(三元运算符)
? :
:根据条件表达式的值选择两个表达式中的一个进行计算。
#include <iostream>
int main() {
int a = 5;
int b = 3;
int result = (a > b) ? a : b;
std::cout << result << std::endl;
return 0;
}
这里,如果 a > b
为真,结果为 a
,否则为 b
。
9. 赋值运算符
=
、+=
、-=
、*=
、/=
、%=
等:用于给变量赋值或进行复合赋值操作。
#include <iostream>
int main() {
int a = 5;
a += 3;
std::cout << a << std::endl;
return 0;
}
此例中,a += 3
等价于 a = a + 3
。
10. 逗号运算符
,
:从左到右依次计算逗号分隔的表达式,结果为最后一个表达式的值。
#include <iostream>
int main() {
int a = (1, 2, 3);
std::cout << a << std::endl;
return 0;
}
这里,表达式 (1, 2, 3)
的结果为 3。
注意事项
- 为了让代码更具可读性,避免因优先级问题引发错误,建议使用括号来明确运算顺序。
- 运算符优先级只是规定了表达式中运算符的执行顺序,在实际编程中,还需要考虑运算符的结合性(从左到右或从右到左)。
你可以参考下面的表格来更清晰地查看运算符优先级:
优先级 | 运算符 | 结合性 |
---|---|---|
1 | :: |
从左到右 |
2 | () [] -> . ++ -- (后缀) |
|
3 | ++ -- (前缀) + - ! ~ (type) * & sizeof alignof |
从右到左 |
4 | .* ->* |
从左到右 |
5 | * / % |
|
6 | + - |
|
7 | << >> |
|
8 | < <= > >= |
|
9 | == != |
|
10 | & |
|
11 | ^ |
|
12 | 按位或 |
|
13 | && |
|
14 | 逻辑或 |
|
15 | ?: |
从右到左 |
16 | = += -= *= /= %= &= ^= 或等于 <<= >>= |
|
17 | , |
从左到右 |
0 条评论
目前还没有评论...