运算符
有几个操作数 就是 几元运算符
1、算术运算符
| *运算符* | *描述* | *操作数个数 (几元运算符)* | *组成的表达式的值* | *副作用* | |
|---|---|---|---|---|---|
| + | 正号 | 1 | 操作数本身 | 无 | |
| - | 负号 | 1 | 操作数符号取反 | 无 | |
| + | 加号 | 2 | 两个操作数之和 | 无 | |
| - | 减号 | 2 | 两个操作数之差 | 无 | |
| ***** | 乘号 | 2 | 两个操作数之积 | 无 | |
| / | 除号 | 2 | 两个操作数之商 | 无 | |
| % | 取模(取余) | 2 | 两个操作数相除的余数 | 无 | |
| ++ | 自增 | 1 | (运算符在后)操作数自增前或(运算符在前)自增后的值 | 有 | 运算符所在位置对 操作数的副作用相同(都自增) |
| -- | 自减 | 1 | (运算符在后)操作数自减前或(运算符在前)自减后的值 | 有 | 运算符所在位置对 操作数的副作用相同(都自减) |
注:一、对于 取余%
1.表达式值得符号(正负)与第一个操作数(被除数)一致
2.取余运算符的操作数必须是整数
二、有副作用的运算符要求:操作数必须是变量的形式!!
2、关系运算符(比较运算符)
注:比较时,有符号转无符号之后再进行比较
| *运算符* | *描述* | *操作数个数(几元运算符)* | *表达式的值(int类型)* | *副作用* |
|---|---|---|---|---|
| == | 相等 | 2 | 0 或 1 | 无 |
| != | 不等 | 2 | 0 或 1 | 无 |
| < | 小于 | 2 | 0 或 1 | 无 |
| > | 大于 | 2 | 0 或 1 | 无 |
| <= | 小于等于 | 2 | 0 或 1 | 无 |
| >= | 大于等于 | 2 | 0 或 1 | 无 |
3、逻辑运算符
| *运算符* | *描述* | *操作数个数* | *表达式的值* | *副作用* |
|---|---|---|---|---|
| && | 逻辑与 | 2 | 0 或 1 | 无 |
| || | 逻辑或 | 2 | 0 或 1 | 无 |
| ! | 逻辑非 | 1 | 0 或 1 | 无 |
4、位运算符 (指的是二进制位)
| *运算符* | *描述* | *操作数个数* | *副作用* |
|---|---|---|---|
| & | 按位与 | 2 | 无 |
| | | 按位或 | 2 | 无 |
| ^ | 按位异或 | 2 | 无 |
| ~ | 按位取反 | 1 | 无 |
| << | 按位左移 | 2 | 无 |
| >> | 按位右移 | 2 | 无 |
5、赋值运算符
1、左边操作数必须是变量的形式,右边操作数可以是变量、常量、表达式
2、从右向左赋值
| *运算符* | *描述* | *操作数个数* | *表达式的值* | *(对左边操作数)副作用* |
|---|---|---|---|---|
| = | 赋值 | 2 | 左边操作数的值 | 有 |
| += | 相加赋值 | 2 | 左边操作数的值 | 有 |
| -= | 相减赋值 | 2 | 左边操作数的值 | 有 |
| *= | 相乘赋值 | 2 | 左边操作数的值 | 有 |
| /= | 相除赋值 | 2 | 左边操作数的值 | 有 |
| %= | 取余赋值 | 2 | 左边操作数的值 | 有 |
| <<= | 左移赋值 | 2 | 左边操作数的值 | 有 |
| >>= | 右移赋值 | 2 | 左边操作数的值 | 有 |
| &= | 按位与赋值 | 2 | 左边操作数的值 | 有 |
| ^= | 按位异或赋值 | 2 | 左边操作数的值 | 有 |
| |= | 按位或赋值 | 2 | 左边操作数的值 | 有 |
6、三元运算符
条件表达式? 表达式1: 表达式2;
表达式取值规则:
① a 成立,b 作为整个表达式的值
② a 不成立,c 作为整个表达式的值
7.其余运算符
, 二元运算符,表达式的值是第二个操作数的值
sizeof
&
* ——取值运算符
. ——成员选择(对象)
-> ——成员选择(指针)
注:添加 () 提高优先级!
二、运算符优先级
(1)不要过多的依赖运算的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用小括号来控制表达式的执行顺序。
(2)不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。
(3)运算符优先级不用刻意地去记忆,总体上:一元运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符。
| *优先级* | *运算符* | *名称或含义* | *结合方向* |
|---|---|---|---|
| *1* | [] | 数组下标 | 左到右 |
| () | 圆括号 | ||
| . | 成员选择(对象) | ||
| -> | 成员选择(指针) | ||
| *2* | - | 负号运算符 | 右到左 |
| (类型) | 强制类型转换 | ||
| ++ | 自增运算符 | ||
| -- | 自减运算符 | ||
| * | 取值运算符 | ||
| & | 取地址运算符 | ||
| ! | 逻辑非运算符 | ||
| ~ | 按位取反运算符 | ||
| sizeof | 长度运算符 | ||
| *3* | / | 除 | 左到右 |
| * | 乘 | ||
| % | 余数(取模) | ||
| *4* | + | 加 | 左到右 |
| - | 减 | ||
| *5* | << | 左移 | 左到右 |
| >> | 右移 | ||
| *6* | > | 大于 | 左到右 |
| >= | 大于等于 | ||
| < | 小于 | ||
| <= | 小于等于 | ||
| *7* | == | 等于 | 左到右 |
| != | 不等于 | ||
| *8* | & | 按位与 | 左到右 |
| *9* | ^ | 按位异或 | 左到右 |
| *10* | | | 按位或 | 左到右 |
| *11* | && | 逻辑与 | 左到右 |
| *12* | || | 逻辑或 | 左到右 |
| *13* | ?: | 条件运算符 | 右到左 |
| *14* | = | 赋值运算符 | 右到左 |
| /= | 除后赋值 | ||
| *= | 乘后赋值 | ||
| %= | 取模后赋值 | ||
| += | 加后赋值 | ||
| -= | 减后赋值 | ||
| <<= | 左移后赋值 | ||
| >>= | 右移后赋值 | ||
| &= | 按位与后赋值 | ||
| ^= | 按位异或后赋值 | ||
| |= | 按位或后赋值 | ||
| *15* | , | 逗号运算符 | 左到右 |

浙公网安备 33010602011771号