运算符与优先级
运算符
运算符 用于标识符之间,它们共同构成一组表达式。
除了小学数学里的加减乘除,还多了一些计算机语言特有的操作符。
C++
a = b | ++a | +a | a == b | a[...] |
a += b | --a | -a | a != b | *a |
a -= b | a++ | a + b | a < b | &a |
a *= b | a-- | a - b | a > b | a->b |
a /= b | !a | a * b | a <= b | a.b |
a %= b | a&&b | a / b | a >= b | a->*b |
a &= b | a||b | a % b | a <=> b | a.*b |
a |= b | a(...) | ~a | ||
a ^= b | a,b | a & b | ||
a <<= b | a?b:c | a | b | ||
a >>= b | a ^ b | |||
a << b | ||||
a >> b |
static_cast | const_cast | new | sizeof | noexcept |
dynamic_cast | reinterpret_cast | delete | typeid | alignof |
Java
= | == | + | += | << |
> | >= | - | -= | >> |
< | <= | * | *= | >>> |
! | != | / | /= | <<= |
~ | && | & | &= | >>= |
? | || | | | |= | >>>= |
: | ++ | ^ | ^= | |
-> | -- | % | %= |
( | [ | { | ; | . |
) | ] | } | , | ... |
@ | :: |
Python
+ | << | < | <= | @ |
- | >> | > | >= | |
* | ** | & | == | |
/ | // | | | != | |
% | ~ | ^ | := |
( | , | = | @ | >>= |
) | : | += | @= | <<= |
[ | ! | -= | %= | **= |
] | . | *= | &= | |
{ | ; | /= | |= | |
} | -> | //= | ^= |
以下为各种语言的运算符介绍:
C++ : cppreference.com
Java : docs.oracle.com
Python : docs.python.org
优先级
运算符 也是有优先级的,就好比 乘法、除法 与 加法、减法。
C++
1 | a::b | 作用域解析 | 从左到右 |
2 | a++ a-- |
后缀自增 后缀自减 |
从左到右 |
2 | type(a) type{a} |
C++风格的 显式类型转换 |
从左到右 |
2 | a() | 函数调用 | 从左到右 |
2 | a[] | 下标访问 | 从左到右 |
2 | a.b a->b |
成员访问 | 从左到右 |
3 | ++a --a |
前缀自增 前缀自减 |
从右到左 |
3 | +a -a |
正号 负号 |
从右到左 |
3 | !a ~a |
逻辑非 按位非 |
从右到左 |
3 | (type)a | C风格的 显式类型转换 |
从右到左 |
3 | *a | 取值 | 从右到左 |
3 | &a | 取址 | 从右到左 |
3 | sizeof | 取大小 | 从右到左 |
3 | co_await | 协程等待异步操作 | 从右到左 |
3 | new - new[] | 动态内存分配 | 从右到左 |
3 | delete - delete[] | 动态内存释放 | 从右到左 |
4 | a.*b a->*b |
成员指针 | 从左到右 |
5 | a*b a/b a%b |
乘法 除法 取余 |
从左到右 |
6 | a+b a-b |
加法 减法 |
从左到右 |
7 | a<<b a>>b |
按位左移 按位右移 |
从左到右 |
8 | a<=>b | 三路比较运算符 | 从左到右 |
9 | a<b a<=b a>b a>=b |
小于 小于等于 大于 大于等于 |
从左到右 |
10 | a==b a!=b |
等于 不等于 |
从左到右 |
11 | a&b | 按位与 | 从左到右 |
12 | a^b | 按位异或 | 从左到右 |
13 | a|b | 按位或 | 从左到右 |
14 | a&&b | 逻辑与 | 从左到右 |
15 | a||b | 逻辑或 | 从左到右 |
16 | a?b:c | 条件表达式 | 从右到左 |
16 | throw | 异常抛出 | 从右到左 |
16 | co_yield | 协程生成值 | 从右到左 |
16 | a = b | 赋值 | 从右到左 |
16 | a += b a -= b |
先做加法,再赋值 先做减法,再赋值 |
从右到左 |
16 | a *= b a /= b a %= b |
先做乘法,再赋值 先做除法,再赋值 先做取余,再赋值 |
从右到左 |
16 | a <<= b a >>= b |
先做按位左移,再赋值 先做按位右移,再赋值 |
从右到左 |
16 | a &= b a ^= b a |= b |
先做按位与,再赋值 先做按位异或,再赋值 先做按位或,再赋值 |
从右到左 |
17 | a,b | 逗号表达式 | 从左到右 |
Java
1 | expr++ expr-- |
后缀自增 后缀自减 |
从左到右 |
2 | ++expr --expr +expr -expr ~ ! |
前缀自增 前缀自减 正号 负号 按位非 逻辑非 |
从左到右 |
3 | * / % |
乘法 除法 取余 |
从左到右 |
4 | + - |
加法 减法 |
从左到右 |
5 | << >> >>> |
按位左移 按位右移 按位无符号右移 |
从左到右 |
6 | < > <= >= |
小于 大于 小于等于 大于等于 |
从左到右 |
7 | a==b a!=b |
等于 不等于 |
从左到右 |
8 | a&b | 按位与 | 从左到右 |
9 | a^b | 按位异或 | 从左到右 |
10 | a|b | 按位或 | 从左到右 |
11 | a&&b | 逻辑与 | 从左到右 |
12 | a||b | 逻辑或 | 从左到右 |
13 | a?b:c | 条件表达式 | 从左到右 |
14 | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
赋值 先做加法,再赋值 先做减法,再赋值 先做乘法,再赋值 先做除法,再赋值 先做取余,再赋值 先做按位与,再赋值 先做按位异或,再赋值 先做按位或,再赋值 先做按位左移,再赋值 先做按位右移,再赋值 先做按位无符号右移,再赋值 |
从右到左 |
Python
1 | (expressions...) [expressions...] {key: value...} {expressions...} |
元组表达式 列表表达式 字典表达式 集合表达式 |
从左到右 |
2 | x[index] x[index:index] x(arguments...) x.attribute |
下标访问 切片 函数调用 属性引用 |
从左到右 |
3 | await x | 等待异步操作 | 从左到右 |
4 | ** | 幂运算 | 从右到左 |
5 | +x -x ~x |
正号 负号 按位非 |
从左到右 |
6 | * @ / // % |
乘法 矩阵乘法 浮点除法 整型除法 取余 |
从左到右 |
7 | + - |
加法 减法 |
从左到右 |
8 | << >> |
按位左移 按位右移 |
从左到右 |
9 | & | 按位与 | 从左到右 |
10 | ^ | 按位异或 | 从左到右 |
11 | | | 按位或 | 从左到右 |
12 | in not in is is not < <= > >= != == |
在 不在 是 不是 小于 小于等于 大于 大于等于 不等于 等于 |
从左到右 |
13 | not x | 逻辑非 | 从左到右 |
14 | and | 逻辑与 | 从左到右 |
15 | or | 逻辑或 | 从左到右 |
16 | if – else | 条件表达式 | 从右到左 |
17 | lambda | lambda表达式 | 从左到右 |
18 | := | 海象操作符 | 从左到右 |
以下为各种语言的运算符优先级介绍:
C++ : cppreference.com
Java : docs.oracle.com
Python : docs.python.org