目录
前言
本文首先明确了一些基本概念,包括求值顺序、优先级、结合律、左值、右值。然后列出了运算符优先级的详细表单,并在表单中总结了运算符的运算结果。表单总结的尽量详细,方便日后查阅使用。
基本概念
在了解运算符优先级之前必须明确一些基本概念
求值顺序、优先级和结合律
求值顺序、优先级和结合律是三个不同的概念。先考虑运算符的优先级,在考虑结合律,而求值顺序与优先级和结合律无关,并且大多数运算符没有规定求值顺序。
例如:a() + b() * c() + d()
? : , && ||
左值(lvalue)与右值(rvalue)
左值有地址可以赋值,右值没有地址不可以赋值;左值既可以在赋值号的左边也可以在右边,右值只能在赋值号的右边。
operand 和 operator n元运算符
运算符优先级
. -> 一元运算符(右结合律) 算数运算 关系运算 逻辑运算 三元运算 赋值 复合 throw ,
结合律 | 运算符 | 功能 | 用法 | 求值结果 |
左 | :: | 全局作用域 | ::name | |
:: | 类作用域 | class::name | ||
:: | 命名空间作用域 | namespace::name | ||
左 | . | 成员选择 | obj.mem | 得到mem |
-> | 解引用并进行成员选择 | obj->mem | 得到mem | |
[] | 下标 | expr[expr] | 如vector[i],得到下标对应的引用 | |
() | 函数调用 | name(expr_list) | 得到函数返回类型 | |
() | 类型构造 | type(expr_list) | ||
右 | ++ | 后置递增运算符 后置形式左结合律才说的通? | lvalue++ | rvalue递增之前的值 返回的是右值 |
-- | 后置递减运算符 | lvalue-- | rvalue递减之前的值 返回的是右值 | |
typeid | 类型ID | typeid(type) | ||
typeid | 运行时类型ID | typeid(expr) | ||
explicite cast | 类型转换 | cast_name<type>(expr) | ||
右 | ++ | 前置递增运算符 | ++lvalue | lvalue递增后的值 返回的是左值 |
-- | 前置递减运算符 | --lvalue | lvalue递减后的值 返回的是左值 | |
~ | 位求反 | ~expr | 求反后的值 | |
! | 逻辑非 | !expr | 取反后的值 | |
- | 一元负号 | -expr | ||
+ | 一元正号 | +expr | ||
* | 解引用 | *expr | 解引用后的值 | |
& | 取地址 | &lvalue | 16/32/64位的地址值 | |
() | 类型转换 | (type)expr | ||
sizeof | 对象的大小 | sizeof expr | ||
sizeof | 类型的大小 | sizeof(type) | ||
Sizeof… | 参数包的大小 | sizeof…(name) | ||
new | 创建动态内存对象 | new type | 返回地址值 | |
new [] | 创建动态内存数组 | new type[size] | 返回数组首地址值 | |
delete | 释放对象 | delete expr | delete后指针的值不变,指向的内存被释放,不能delete栈上的空间 | |
delete[] | 释放数组 | delete[] expr | ||
noexcept | 能否抛出异常 | noexcept(expr) | ||
左 | ->* | 指向成员选择的指针 | ptr->*ptr_to_member | |
.* | 指向成员选择的指针 | obj.*ptr_to_member | ||
左 | * | 乘法 | expr*expr | |
/ | 除法 | expr/expr | ||
% | 取模(取余) | expr%expr | ||
左 | + | 加法 | expr+expr | |
- | 减法 | expr-expr | ||
左 | << | 向左移位 | expr << expr | 类似加法,输出结果 |
>> | 向右移位 | expr >> expr | ||
左 | < | 小于 | expr < expr | |
<= | 小于等于 | expr <= expr | ||
> | 大于 | expr > expr | ||
>= | 大于等于 | expr >= expr | ||
左 | == | 相等 | expr == expr | |
!= | 不等 | expr != expr | ||
左 | & | 位与 | expr & expr | |
左 | ^ | 位异或 | expr ^ expr | |
左 | | | 位或 | expr | expr | |
左 | && | 逻辑与 | expr && expr | |
左 | || | 逻辑或 | expr || expr | |
右 | ? : | 条件 | expr ? expr : expr | |
右 | = | 赋值 | lvalue = expr | 赋值后的lvalue |
右 | *=, /=, %= +=, -= <<=, >>= &=, |=, ^= | 复合赋值 | lvalue += expr | 运算后的lvalue |
右 | throw | 抛出异常 | throw expr | |
左 | , | 逗号 | expr, expr | 最右边的值 |
备注
a++;
mov eax, dword ptr [a] # 1将a搬运至寄存器
inc eax # 寄存器自增1
mov dword ptr [a], eax # 再搬回a
int a = b;
mov eax dword ptr [b] # 将b搬运给寄存器
mov dword ptr [a] eax # 将寄存器的值搬运给a
总结
本文首先明确了一些基本概念,包括求值顺序、优先级、结合律、左值、右值。然后列出了运算符优先级的详细表单,并在表单中总结了运算符的运算结果。表单总结的尽量详细,方便日后查阅使用。