C++语法 运算符优先级
建议不确定运算符优先级就都多套几个括号,尤其是位运算符。
优先级 | 运算符 | 叙述 | 示例 | 重载性 | 结合性 |
---|---|---|---|---|---|
1 | :: |
作用域解析(C++专有) | Class::age = 2; |
否 | 由左至右 |
2 | ++ |
后缀递增 | i++ |
||
-- |
后缀递减 | i-- |
|||
() |
函数调用或函数调用形式的类型转换 | int x = f(); |
|||
[] |
数组访问 | array[4] = 2; |
|||
. |
以对象方式访问成员 | obj.age = 34; |
否 | ||
-> |
以指针方式访问成员 | ptr->age = 34; |
|||
dynamic_cast |
运行时检查类型转换(C++专有) | Y& y = dynamic_cast |
否 | ||
static_cast |
未经检查的类型转换(C++专有) | Y& y = static_cast |
否 | ||
reinterpret_cast |
重定义类型转换(C++专有) | int const* p = reinterpret_cast |
否 | ||
const_cast |
更改非常量属性(C++专有) | int* q = const_cast |
否 | ||
typeid |
获取类型信息(C++专有) | std::type_info const& t = typeid(x); |
否 | ||
3 | ++ |
前缀递增 | ++i |
由右至左 | |
-- |
前缀递减 | --i |
|||
+ |
一元正号 | int i = +1; |
|||
- |
一元负号 | int i = -1; |
|||
! not |
逻辑非! 的备用拼写 |
if (!done) … |
|||
~ compl |
按位取反~ 的备用拼写 |
flag1 = ~flag2; |
|||
('type') |
强制类型转换 | int i = (int)floatNum; |
|||
* |
取指针指向的值 | int data = *intPtr; |
|||
& |
取变量的地址 | int *intPtr = &data; |
|||
sizeof |
某某的大小 | size_t s = sizeof(int); |
否 | ||
new |
动态内存分配(C++特有) | long* pVar = new long; |
|||
new[] |
动态数组内存分配(C++特有) | long* array = new long[20]; |
|||
delete |
动态内存释放(C++特有) | delete pVar; |
|||
delete[] |
动态数组内存释放(C++特有) | delete[] array; |
|||
4 | .* |
成员对象选择(C++专有) | obj.*var = 24; |
否 | 由左至右 |
->* |
成员指针选择(C++专有) | ptr->*var = 24; |
|||
5 | * |
乘法 | int i = 2 * 4; |
||
/ |
除法 | float f = 10.0 / 3.0; |
|||
% |
模数(取余数) | int rem = 4 % 3; |
|||
6 | + |
加法 | int i = 2 + 3; |
||
- |
减法 | int i = 5 - 1; |
|||
7 | << |
位元左移 | int flags = 33 << 1; |
||
>> |
位元右移 | int flags = 33 >> 1; |
|||
8 | <=> |
三路比较(C++20) | auto flags = 33 <=> 1; |
||
9 | < |
小于关系 | if (i < 42) … |
||
<= |
小于等于关系 | if (i <= 42) ... |
|||
> |
大于关系 | if (i > 42) … |
|||
>= |
大于等于关系 | if (i >= 42) ... |
|||
10 | == |
等于关系 | if (i == 42) ... |
||
!= not_eq |
不等于关系!= 的备用拼写 |
if (i != 42) … |
|||
11 | & bitand |
位元 AND& 的备用拼写 |
flag1 = flag2 & 42; |
||
12 | ^ xor |
位元 XOR(独占or)^ 的备用拼写 |
flag1 = flag2 ^ 42; |
||
13 | | bitor |
位元 OR(包含or)| 的备用拼写 |
flag1 = flag2 | 42; |
||
14 | && and |
逻辑 AND&& 的备用拼写 |
if (conditionA && conditionB) … |
||
15 | || or |
逻辑 OR|| 的备用拼写 |
if (conditionA || conditionB) ... |
||
16 | c?t:f |
三元条件运算 | int i = a > b ? a : b; |
否 | 由右至左 |
17 | = |
直接赋值 | int a = b; |
||
+= |
以和赋值 | a += 3; |
|||
-= |
以差赋值 | b -= 4; |
|||
*= |
以积赋值 | a *= 5; |
|||
/= |
以商赋值 | a /= 2; |
|||
%= |
以取余数赋值 | a %= 3; |
|||
<<= |
以位元左移赋值 | flags <<= 2; |
|||
>>= |
以位元右移赋值 | flags >>= 2; |
|||
&= and_eq |
以位元AND赋值&= 的备用拼写 |
flags &= new_flags; |
|||
^= xor_eq |
以位元XOR赋值^= 的备用拼写 |
flags ^= new_flags; |
|||
|= or_eq |
以位元OR赋值|= 的备用拼写 |
flags |= new_flags; |
|||
18 | throw |
抛出异常 | throw EClass("Message"); |
否 | 由右至左 |
19 | , |
逗号运算符 | for (i = 0, j = 0; i < 10; i++, j++) … |
由左至右 |
参考文献: