运算符
- 位运算
位运算只能用于整数类型的变量,且需当它们拥有等长位模式时。
- 位运算 -- 二元运算符
按位与 &: 数值的每个二进制位两两比较,按照以下规则得出结果的每个对应位。
1 & 1 -> 1
1 & 0 -> 0
0 & 1 -> 0
0 & 0 -> 0
按位或 |: 数值的每个二进制位两两比较,按照以下规则得出结果的每个对应位。
1 | 1 -> 1
1 | 0 -> 1
0 | 1 -> 1
0 | 0 -> 0
按位异或 ^: 数值的每个二进制位两两比较,按照以下规则得出结果的每个对应位。
1 ^ 1 -> 0
1 ^ 0 -> 1
0 ^ 1 -> 1
0 ^ 0 -> 0
按位取反 ~: 数值的每个二进制位取反,0 变成 1,1 变成 0,
int i = 3;
printf("~i=%d",~i);// -4
- 位运算 -- 移位运算符
位左移 <<:
用法:bitP << n bitP 的位向左(从低位移至高位)移动 n 位,右侧空白部分使用 0 填充;
1 << 10 // 等于 1024
1 << 20 // 等于 1048576
1 << 30 // 等于 1073741824
位右移 >>:
用法:bitP >> n。 bitP 的位向右(从高位向低位)移动 n 位,左侧空白部分使用符号位(即原本数值的最高位)填充;
1 >> 10 // 等于 0
-1 >> 10 // 等于 -1
31 >> 2 // 等于 7
需要注意,无论是左移还是右移,位移的位数 n 都应当是非负整数,并且应当小于 64,否则行为受制于平台实现,可能出现意外的情况。
- 逻辑运算符
==、!=、<、<=、>、>=
逻辑与 &&
bool flag = 1 && 0;// flag is false
逻辑或 ||
bool flag = 1 || 0;// flag is true
逻辑非 !
bool flag = !0;// flag is true
它们之所以被称为逻辑运算符是因为它们的运算结果总是为布尔值 bool。例如:
flag = 10 > 5; // flag is true
- 算术运算符
常见可用于整数和浮点数的二元运算符有 +、-、* 和 /.
/ 对于整数运算而言,结果依旧为整数,例如:9 / 4 -> 2.
取余 % 运算符只能作用于整数:9 % 4 -> 1。
整数除以 0 会导致异常:Error(-1): Divided by zero
; 除此之外,INT64_MIN / -1 会导致抛出除法溢出异常。
浮点数除以 0.0 会返回一个无穷尽的结果,使用 inf 表示。
- 逗号运算符
表达式,表达式,…
int a = 1,b = 2;
- 三目运算符
a > b ? a : b
是一个条件表达式,如果a > b条件为真,则条件表达式去值a,否则取值b
- 复合赋值运算符
+= , -= , *= , /= , %= , &= , |= , ^= , ~= , <<= , >>=
i += 4; // i = i + 4
j %= 2; // j = j % 2
- 自增自减运算符
自加运算符“++”和自减运算符“--”的作用是使运算变量的值增1或减1
自加、自减运算符是单目运算符。其运算对象可以是整型或实型变量,但不能是常量和表达式,因为不能给常量或者表达式赋值
自加、自减运算符可以作为可以作为前缀运算符,也可以作为后缀运算符构成一个表达式,如++i、--i、i++、i--等都是合法的表达式
++i、--i:在使用i之前,先使i的值加1或减1,再使此时的表达式的值参加运算
i++、i--:在使用i之后,使i的值加1或减1,再使此时的表达式的值参加运算
- 运算符的优先级
有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。
下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
当然,你可以通过使用括号来临时提升某个表达式的整体运算优先级。
下面列出int类型优先级排序列表,其优先级从上往下递减。
序号 | 运算符 | 结合性 |
---|---|---|
1 | () , [] | 从左向右 |
2 | !(非) , +(正) , -(负) , ~(按位非) , ++ , -- | 从左向右 |
3 | * , / , % | 从左向右 |
4 | +(加) , -(减) | 从左向右 |
5 | <<(左移) , >>(右移) | 从左向右 |
6 | < , <= , > , >= | 从左向右 |
7 | == , != | 从左向右 |
8 | &(按位与) | 从 左向右 |
9 | ^(按位异或) | 从左向右 |
10 | 一竖(按位或) | 从左向右 |
11 | &&(与) | 从左向右 |
12 | 两竖(或) | 从左向右 |
13 | ?: | 从右向左 |
14 | = , += , -= , *= , /= , %= , &= , |= , ^= , ~= , <<= , >>= | 从右向左 |
注:因为表格会将 “|”格式化,故用文字表一竖表示“|”,两竖表示“||”
下面列出float类型优先级排序列表,其优先级从上往下递减。
序号 | 运算符 | 结合性 |
---|---|---|
1 | () , [] | 从左向右 |
2 | !(非) , +(正) , -(负) , ++ , -- | 从左向右 |
3 | * , / , % | 从左向右 |
4 | +(加) , -(减) | 从左向右 |
5 | < , <= , > , >= | 从左向右 |
6 | == , != | 从左向右 |
7 | &&(与) | 从左向右 |
8 | 两竖(或) | 从左向右 |
9 | ?: | 从右向左 |
10 | = , += , -= , *= , /= , %= | 从右向左 |
因为表格会将 “|”格式化,故用文字两竖表示“||”