🎓博主介绍:精通 C、Python、Java、JavaScript 等编程语言,具备全栈开发能力。日常专注于分享编程干货、算法解析、项目实战经验,以及前沿技术动态。让我们一起在技术的道路上不断探索,共同成长!
运算符优先级终极指南:44种运算符速查表
1. 引言
在编程的世界里,运算符是构建表达式和控制程序逻辑的基础元素。运算符优先级决定了表达式中各个运算符执行的先后顺序,这直接影响到程序的计算结果和逻辑正确性。理解和掌握运算符优先级对于编写高效、准确的代码至关重要。本文将为技术人员提供一份全面的运算符优先级指南,包含44种常见运算符的速查表,并通过详细的示例和解释帮助大家深入理解。
2. 运算符优先级概述
运算符优先级是指在一个表达式中,不同运算符执行的先后顺序。当一个表达式中包含多个运算符时,具有较高优先级的运算符会先被计算,然后再计算优先级较低的运算符。如果运算符优先级相同,则按照运算符的结合性(从左到右或从右到左)来确定计算顺序。
2.1 结合性的概念
结合性决定了具有相同优先级的运算符在表达式中计算的顺序。结合性分为左结合性(从左到右计算)和右结合性(从右到左计算)。例如,加法和减法运算符具有左结合性,而赋值运算符具有右结合性。
以下是一个简单的Python代码示例,展示了结合性的影响:
# 加法运算符的左结合性
result1 = 3 + 5 - 2 # 先计算3 + 5 = 8,再计算8 - 2 = 6
print(result1)
# 赋值运算符的右结合性
a = b = c = 10 # 先将10赋值给c,再将c的值赋值给b,最后将b的值赋值给a
print(a, b, c)
3. 44种运算符速查表
3.1 按语言分类的运算符速查表
不同的编程语言具有不同的运算符集合和优先级规则。下面我们将分别介绍Python、Java和C++三种常见编程语言的运算符优先级。
3.1.1 Python运算符优先级
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | () | 括号 | 无 |
2 | ** | 幂运算 | 右 |
3 | +x , -x , ~x | 正号、负号、按位取反 | 右 |
4 | * , / , // , % | 乘法、除法、整除、取模 | 左 |
5 | + , - | 加法、减法 | 左 |
6 | << , >> | 按位左移、按位右移 | 左 |
7 | & | 按位与 | 左 |
8 | ^ | 按位异或 | 左 |
9 | ` | ` | 按位或 |
10 | < , <= , > , >= , == , != | 比较运算符 | 左 |
11 | is , is not | 身份运算符 | 左 |
12 | in , not in | 成员运算符 | 左 |
13 | not | 逻辑非 | 右 |
14 | and | 逻辑与 | 左 |
15 | or | 逻辑或 | 左 |
16 | = , += , -= , *= , /= , //= , %= , **= , <<= , >>= , &= , ^= , ` | =` | 赋值运算符 |
以下是一个Python代码示例,展示了运算符优先级的应用:
result = 3 + 5 * 2 ** 2 # 先计算2 ** 2 = 4,再计算5 * 4 = 20,最后计算3 + 20 = 23
print(result)
3.1.2 Java运算符优先级
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | () | 括号 | 无 |
2 | ++ , -- , + , - , ~ , ! | 自增、自减、正号、负号、按位取反、逻辑非 | 右 |
3 | * , / , % | 乘法、除法、取模 | 左 |
4 | + , - | 加法、减法 | 左 |
5 | << , >> , >>> | 按位左移、按位右移、无符号右移 | 左 |
6 | < , <= , > , >= | 比较运算符 | 左 |
7 | == , != | 相等性比较运算符 | 左 |
8 | & | 按位与 | 左 |
9 | ^ | 按位异或 | 左 |
10 | ` | ` | 按位或 |
11 | && | 逻辑与 | 左 |
12 | ` | ` | |
13 | ?: | 三元运算符 | 右 |
14 | = , += , -= , *= , /= , %= , <<= , >>= , >>>= , &= , ^= , ` | =` | 赋值运算符 |
以下是一个Java代码示例,展示了运算符优先级的应用:
public class OperatorPrecedenceExample {
public static void main(String[] args) {
int result = 3 + 5 * 2; // 先计算5 * 2 = 10,再计算3 + 10 = 13
System.out.println(result);
}
}
3.1.3 C++运算符优先级
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | :: | 作用域解析运算符 | 左 |
2 | () , [] , . , -> , ++ , -- | 括号、数组下标、成员访问、指针成员访问、后缀自增、后缀自减 | 左 |
3 | ++ , -- , + , - , ! , ~ , (type) , * , & , sizeof | 前缀自增、前缀自减、正号、负号、逻辑非、按位取反、类型转换、解引用、取地址、求字节数 | 右 |
4 | .* , ->* | 成员指针访问运算符 | 左 |
5 | * , / , % | 乘法、除法、取模 | 左 |
6 | + , - | 加法、减法 | 左 |
7 | << , >> | 按位左移、按位右移 | 左 |
8 | < , <= , > , >= | 比较运算符 | 左 |
9 | == , != | 相等性比较运算符 | 左 |
10 | & | 按位与 | 左 |
11 | ^ | 按位异或 | 左 |
12 | ` | ` | 按位或 |
13 | && | 逻辑与 | 左 |
14 | ` | ` | |
15 | ?: | 三元运算符 | 右 |
16 | = , += , -= , *= , /= , %= , <<= , >>= , &= , ^= , ` | =` | 赋值运算符 |
17 | , | 逗号运算符 | 左 |
以下是一个C++代码示例,展示了运算符优先级的应用:
#include <iostream>
int main() {
int result = 3 + 5 * 2; // 先计算5 * 2 = 10,再计算3 + 10 = 13
std::cout << result << std::endl;
return 0;
}
3.2 通用规则和注意事项
- 括号优先:括号可以改变运算符的优先级,使用括号可以明确指定计算顺序,提高代码的可读性和可维护性。例如:
result = (3 + 5) * 2 # 先计算3 + 5 = 8,再计算8 * 2 = 16
print(result)
- 逻辑短路:逻辑与(
&&
)和逻辑或(||
)运算符具有短路特性。在逻辑与运算中,如果第一个操作数为假,则不会计算第二个操作数;在逻辑或运算中,如果第一个操作数为真,则不会计算第二个操作数。例如:
a = 0
b = 5
if a != 0 and b / a > 1: # 由于a != 0为假,不会计算b / a
print("条件成立")
else:
print("条件不成立")
4. 实际应用案例
4.1 复杂表达式的计算
在实际编程中,我们经常会遇到复杂的表达式,需要根据运算符优先级来正确计算结果。例如,计算一个二次函数的值:
import math
# 定义二次函数的系数
a = 2
b = 3
c = 1
# 计算二次函数的值
x = 2
result = a * x ** 2 + b * x + c # 先计算x ** 2,再计算a * x ** 2和b * x,最后相加
print(result)
4.2 条件判断和逻辑运算
在条件判断语句中,运算符优先级决定了条件的计算顺序。例如,判断一个年份是否为闰年:
year = 2024
# 判断是否为闰年的条件
is_leap_year = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
print(is_leap_year)
5. 结论
运算符优先级是编程中一个非常重要的概念,它直接影响到程序的计算结果和逻辑正确性。通过本文提供的44种运算符速查表,我们可以快速了解不同编程语言中运算符的优先级和结合性。在编写代码时,我们应该合理使用括号来明确计算顺序,避免因运算符优先级问题导致的错误。同时,要注意逻辑短路等特性的应用,提高代码的效率。