运算符 | 结合律 | 功能 | 用法 |
---|---|---|---|
:: :: :: | 左 | 全局作用域 类作用域 命名空间作用域 | ::name class::name namespace::name |
. -> [] () () | 左 | 成员选择 成员选择 下标 函数调用 类型构造 | a.b a->b a[b] 函数名(参数) 类型(参数) |
++ -- typeid typeid explicit cast | 右 | 后置递增 后置递减 类型ID 运行时类型ID 类型转换 | a++ a-- typeid(type) typeid(expr) cast_name<type>(expr) |
++ -- ~ ! - + * & () sizeof sizeof Sizeof... new new[] delete delete[] noexcept | 右 | 前置递增 前置递减 位求反 逻辑非 一元负号 一元正号 解引用 取地址 类型转换 对象的大小 类型的大小 参数包的大小 创建对象 创建数组 释放对象 释放数组 能否抛出异常 | ++a --a ~a !a -a +a *a &a (type)a sizeof a sizeof(type) sizeof...(name) new type new type[size] delete a delete[] a noexcept(expr) |
->* .* | 左 | 指向成员选择的指针 指向成员选择的指针 | ptr->*member ptr.*member |
* / % | 左 | 乘法 除法 取模 | 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^b |
| | 左 | 位或 | a|b |
&& | 左 | 逻辑与 | a&&b |
|| | 左 | 逻辑或 | a||b |
?: | 右 | 条件 | a?b:c |
= | 右 | 赋值 | a=b |
*=,/=,%= +=,-= <<=,>>= &=,|=,^= | 右 | 复合赋值 | a+=b等 |
throw | 右 | 抛出异常 | throw a |
, | 左 | 逗号 | a,b |
这个表按优先级从高到低的顺序排列,最上面的运算符优先级最高,往下运算符优先级降低,同一格内的运算符优先级相同,按左右结合律来决定先执行谁
左结合律
在C++中,左结合律是指多个相同优先级的操作符按照从左到右的顺序进行计算。
一个常见的左结合操作符是加法操作符+和减法操作符-。考虑下面的表达式:
int a = 5 + 3 - 1;
按照左结合律,首先计算5 + 3,然后再计算结果 - 1。
另一个示例是乘法操作符*和除法操作符/。考虑下面的表达式:
int a = 10 / 2 * 3;
按照左结合律,首先计算10 / 2,然后再将结果乘以3。
需要注意的是,左结合律适用于大多数操作符,但也有一些例外情况,如赋值操作符=和递减操作符--是右结合的。在编写代码时,了解操作符的结合性是十分重要的,以保证表达式的计算顺序符合预期。
右结合律
在C++中,右结合律是指多个相同优先级的操作符按照从右到左的顺序进行计算。
一个常见的右结合操作符是赋值操作符=。考虑下面的表达式:
int a = b = 5;
按照右结合律,首先将5赋值给b,然后再将b的值赋值给a。
另一个示例是递减操作符--。考虑下面的表达式:
int a = 5; int b = --a;
按照右结合律,先对a进行递减操作,然后将递减后的结果赋值给b。
需要注意的是,大多数操作符都是左结合的,而右结合律通常适用于少数操作符,如赋值操作符和递减操作符。