优先级与结合性
1,同一优先级的运算符,运算次序由结合方向决定。例如:"*"与"/"具有相同的优先级,其结合方向都是自左向右,因此3*5/4的运算次序就是先乘后除;负号运算符"-"和前置运算符"++"为同一优先级,结合方向为自右向左,因此,-++i相当于-(++i);
2,不同的运算符有不同运算对象个数双目运算符就要求在运算符两侧各有一个运算对象(如3+2,5—1等)。单目运算符只能在运算符的一侧出现一个运算对象(如-a,i++,-i,sizeof(int),*p等)。条件运算符是c++中唯一一个三目运算符,如a>b?a:b。
3,结合性自右向左的运算符,自增自减(前置),条件运算符,以及下表中的第2和第14行。
运算符优先表
优先级 | 运算符 | 描述 |
1 | () [] -> . | 从左到右的成员访问和函数调用 |
2 | ! ~ ++ -- (type) * & | 逻辑非、位求反、自增、自减、一元加减、类型转换、取地址、间接引用 |
3 | * / % | 乘法、除法、取模 |
4 | + - | 加法、减法 |
5 | << >> | 左移、右移 |
6 | < <= > >= | 关系运算符 |
7 | == != | 相等性运算符 |
8 | & | 位与 |
9 | ^ | 位异或 |
10 | | | 位或 |
11 | && | 逻辑与 |
12 | || | 逻辑或 |
13 | ?: | 条件运算符 |
14 | = += -= *= /= %= | 赋值和复合运算符 |
15 | , | 逗号运算符 |
位运算
位运算,是一种对运算对象按二进制位进行操作的运算。位运算不允许只操作其中的某一位,而是对整个数据按二进制位进行运算。位运算的对象只能是整型数据(含字符型),运算结果仍是整型。
位运算的优先级:
~ 位求反
<< , >> ~位偏移
& 位与
^ 位异或
| 位或
符号 | 描述 | 运算规则 |
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1(助记:见不得人成双成对) |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |