• 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;
}

这里,-aa 的负值,!aa 的逻辑值取反。

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;
}

此例中,比较 ab 的大小。

6. 位运算符

  • 按位与 &:对两个操作数的对应二进制位进行与运算。
  • 按位异或 ^:对两个操作数的对应二进制位进行异或运算。
  • 按位或 |:对两个操作数的对应二进制位进行或运算。
#include <iostream>
int main() {
    int a = 5;
    int b = 3;
    int result = a & b;
    std::cout << result << std::endl;
    return 0;
}

这里,对 ab 进行按位与运算。

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 条评论

目前还没有评论...