运算符优先级和关联性

两个运算符特征确定如何使用运算符对操作数进行分组: 优先顺序关联性。 优先顺序是将不同类型的运算符与其操作数进行分组的优先级。 关联性是将操作数分组到具有相同优先顺序的运算符的从左到右或从右到左顺序。 仅当存在其他具有更高或更低优先级的运算符时,运算符的优先顺序才有意义。 首先对具有较高优先顺序的运算符的表达式进行求值。 可以使用括号强制对操作数进行分组。

例如,在以下语句中,由于 = 运算符的从右到左关联性,因此会将 5 的值同时分配给 ab 。 首先将 c 的值分配给 b ,然后将 b 的值分配给 a
b = 9;
c = 5;
a = b = c;

由于未指定子表达式求值的顺序,因此您可以使用括号显式地强制使用运算符对操作数进行分组。

在表达式中
a + b * c / d
由于优先顺序, */ 操作在 + 之前执行。 由于关联性, b 在除以 d 之前乘以 c

下表按优先顺序列出了 C 和 C++ 语言运算符,并显示了每个运算符的关联性方向。 具有相同列组的运算符具有相同的优先顺序。

表 1. 后缀运算符的优先顺序和关联性
排名 正确的关联? 运算符函数 使用量
1 仅限 C + + 全局范围分辨率 :: name_or_qualified name
1   仅限 C + + 类或命名空间作用域解析 class_or_namespace :: 成员
2   成员选择 object成员
2   成员选择 指针 -> 成员
2   下标 指针 [ expr ]
2   函数调用 expr ( expr_list )
2   价值构造 type ( expr_list )
2   后缀增量 lvalue + +
2   后缀递减 lvalue --
2 仅限 C + + 型号识别 类型标识 ( type )
2 仅限 C + + 运行时类型识别 类型标识 ( expr )
2 仅限 C + + 编译时检查转换 static_cast < 类型 > ( 阿德尔 )
2 仅限 C + + 运行时检查转换 dynamic_cast < 类型 > ( 阿德尔 )
2 仅限 C + + 不加节制的转变 reinterpret_cast < 类型 > ( 阿德尔 )
2 仅限 C + + const 转换 const_cast < 类型 > ( 阿德尔 )
表 2。 一元运算符的优先顺序和关联性
排名 正确的关联? 运算符函数 使用量
3 以字节计的对象大小 sizeof 表达式
3 类型大小 (以字节为单位) sizeof ( type )
3 前缀增量 + + lvalue
3 前缀递减 -- lvalue
3 按位非 ~ 表达式
3 not ! 表达式
3 一元减号 - 表达式
3 一元加 + 表达式
3 ADDRESS OF & Lvalue
3 间接或取消引用 * 表达式
3 仅限 C + + 创建(分配内存) 新建 类型
3 仅限 C + + 创建(分配和初始化内存) 新的 类型 ( expr_list ) 类型
3 仅限 C + + 创造(安置) 新的 类型 ( expr_list ) type ( expr_list )
3 仅限 C + + 销毁(释放内存) 删除 指针
3 仅限 C + + 销毁数组 删除 [] 指针
3 类型转换 (强制类型转换) ( type ) 表达式
表 3。 二进制运算符的优先顺序和关联性
排名 正确的关联? 运算符函数 使用量
4   仅限 C + + 成员选择 对象 .* ptr_to_member
4   仅限 C + + 成员选择 对象 -> * ptr_to_member
5 代   乘法 expr * expr
5 代   部门 expr / expr
5 代   模 (余数) expr % expr
6   二进制添加 expr + expr
6   二元减法 expr - expr
距离   按位向左移位 阿德尔 << 阿德尔
距离   按位向右移位 expr >> expr
8 周   小于 阿德尔 < 阿德尔
8 周   小于或等于 阿德尔 <= 阿德尔
8 周   大于 expr > expr
8 周   大于或等于 expr > = expr
900   equal expr == 表达式
900   不等于 expr ! = expr
10   按位“与” exprexpr
11   按位“异或” 表达式 ^ 表达式
12   按位 (含) 或 expr | expr
13   逻辑“与” 阿德尔 && 阿德尔
14 日   逻辑包含 OR expr | | expr
15   条件表达式 expr ? expr : expr
16 简单分配 lvalue = 表达式
16 乘并分配 lvalue * = expr
16 划分和分配 lvalue /= 表达式
16 模并分配 lvalue %= 表达式
16 添加和分配 lvalue + = 表达式
16 减去并分配 lvalue -= expr
16 左移并分配 Lvalue <<= 阿德尔
16 右移并分配 lvalue >> = expr
16 按位 AND 和赋值 Lvalue &= 阿德尔
16 按位排他 OR 和赋值 lvalue ^ = 表达式
16 按位 (含) 或并分配 lvalue | = 表达式
17 仅限 C + + 表达 抛出 expr
18   逗号 (排序) exprexpr