C++操作符的优先级
C++操作符的优先级 | |||
操作符及其结合性 | 功能 | 用法 | |
L L L | :: :: :: | 全局作用域 类作用域 名字空间作用域 | ::name class::name namespace::name |
L L L L L | . -> [] () () | 成员选择 成员选择 下标 函数调用 类型构造 | object.member pointer->member variable[expr] name(expr_list) type(expr_list) |
R R R R R | ++ -- typeid typeid 显示强制类型转换 | 后自增操作 后自减操作 类型ID 运行时类型ID 类型转换 | lvalue++ lvalue-- typeid(type) typeid(expr) cast_name<type>(expr) |
R R R R R R R R R R R R R R | sizeof sizeof ++ -- ~ ! - + * & () new delete delete[] | 对象的大小 类型的大小 前自增操作 前自减操作 位求反 逻辑非 一元负号 一元正号 解引用 取地址 类型转换 创建对象 释放对象 释放数组 | sizeof expr sizeof(type) ++lvalue --lvalue ~expr !expr -expr +expr *expr &expr (type)expr new type delete expr delete []expr |
L L | ->* .* | 指向成员操作的指针 指向成员操作的指针 | ptr->*ptr_to_member obj.*ptr_to_member |
L L L | * / % | 乘法 除法 求模(求余) | expr * expr expr / expr expr % expr |
L L | + - | 加法 减法 | expr + expr expr - expr |
L L | << >> | 位左移 位右移 | expr << expr expr >> expr |
L L L L | < <= > >= | 小于 小于或等于 大于 大于或等于 | expr < expr expr <= expr expr > expr expr >= expr |
L R | == != | 相等 不等 | Expr == expr Expr != expr |
R | & | 位与 | Expr & expr |
R | ^ | 位异或 | Expr ^ expr |
R | | | 位或 | Expr | expr |
R | && | 逻辑与 | Expr && expr |
R | || | 逻辑或 | Expr || expr |
R | ?: | 条件操作 | Expr ? expr : expr |
R R R R R | = *=,/=,%= +=,-= <<=,>>= &=,|=,^= | 赋值操作 符合赋值操作 | Lvalue= expr Lvalue+= expr …… |
R | throw | 抛出异常 | Throw expr |
L | , | 逗号 | Expr, expr |
--摘自《C语言程序设计实用问答》 -吕凤翥 吕 涛著
问题:如何记住运算符的15种优先级和结合性?
解答:C语言中运算符种类比较繁多,优先级有15种,结合性有两种。
如何记忆两种结合性和15种优先级?下面讲述一种记忆方法。
结合性有两种,一种是自左至右,另一种是自右至左,大部分运算符的结合性是自左至右,只有单目运算符、三目运算符的赋值运算符的结合性自右至左。
优先级有15种。记忆方法如下:
记住一个最高的:构造类型的元素或成员以及小括号。
记住一个最低的:逗号运算符。
剩余的是一、二、三、赋值。
意思是单目、双目、三目和赋值运算符。
在诸多运算符中,又分为:
算术、关系、逻辑。
两种位操作运算符中,移位运算符在算术运算符后边,逻辑位运算符在逻辑运算符的前面。再细分如下:
算术运算符分 *,/,%高于+,-。
关系运算符中,》,》=,《,〈=高于==,!=。
逻辑运算符中,除了逻辑求反(!)是单目外,逻辑与(&&)高于逻辑或(||)。
逻辑位运算符中,除了逻辑按位求反(~)外,按位与(&)高于按位半加(^),高于按位或(|)。
这样就将15种优先级都记住了,再将记忆方法总结如下:
去掉一个最高的,去掉一个最低的,剩下的是一、二、三、赋值。双目运算符中,顺序为算术、关系和逻辑,移位和逻辑位插入其中。