1. 运算符
运算符是一种表示对数据进行何种操作处理的符号,每种运算符都有其功和运算规则。运算符主要有算术运算符、赋值运算符、自加自减运算符、关系运算符、逻辑运算符、位运算符以及其他运算符。
1.1 算术运算符
算术运算符主要有+、-、*、/、%五种。
| 运算符 | 含义 | 示例 |
|---|---|---|
| + | 加法或取正值运算 | a + b, + 5 |
| - | 减法或取负值运算 | a - b, - 3 |
| * | 乘法运算 | x * y |
| / | 除法运算 | x / y |
| % | 取模运算(求余运算) | 5 % 3 |
1.2 赋值运算符
赋值运算符是“=”,其功能是先计算赋值运算符“=”右边表达式的值,并将其赋给“=”左边的变量。其一般形式为:
变量名 = 表达式
除了“=”这种简单的赋值运算符,还有复合的赋值运算符,在赋值运算符前加上算术运算符就构成了复合的赋值运算符,例如“+=”就是先进行加法运算后并将此值赋值给等式左边:
x += 5 就等于 x = x + 3。
| 运算符 | 含义 | 示例 |
|---|---|---|
| = | 将右边的值赋值给左边 | a = 5 |
| += | 加法运算后的值赋给左边 | b += 3 |
| -= | 减法运算后的值赋给左边 | b -= 3 |
| *= | 乘法运算后的值赋给左边 | x *= 5 |
| /= | 除法运算后的值赋给左边 | x /= 5 |
| %= | 取模运算后的值赋给左边 | x %= 5 |
1.3 自加自减运算符
自加运算符“++”和自减运算符“--”的功能是使变量的值加1或减1,其优先级较高,但只能作用于简单变量。
| 运算符 | 含义 | 示例 |
|---|---|---|
| ++ | 自增运算 | a++,++a |
| -- | 自减运算 | b--,--b |
注意: 自加(减)运算符有两种形式:
- 前缀形式
即运算符置于变量的前面。如表达式++i、--i。它将变量达到值先加1或减1,然后用新的值参与表达式的运算。
- 后缀形式
即运算符置于变量的后面。如表达式j++、j--。它会先用变量的值参与表达式的运算,运算完成后再将变量的值加1或减1.
1.4 关系运算符
关系运算符用来比较两个数据的大小,运算的结果只有两种: 真(1),假(0)
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
| 大于 | 3 > 5 | 0 | |
| >= | 大于等于 | 5 >= 3 | 1 |
| < | 小于 | 3 < 5 | 1 |
| <= | 小于等于 | 5 <= 3 | 0 |
| == | 等于 | 3 == 5 | 0 |
| != | 不等于 | 3 != 5 | 1 |
1.5 逻辑运算符
逻辑运算符能处理更加复杂的条件判断,它的运算结果也只有两种:真(1),假(0)。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
| && | 逻辑与 | 3 && 5,2 && 0 | 1,0 |
| || | 逻辑或 | 2||0,0||0 | 1,0 |
| ! | 逻辑非 | !2, !0 | 0,1 |
1.6 位运算符
位运算符号多用于硬件编程和网络地址的计算,他是将数据转换成二进制的格式下进行计算的,再将结果转换会原进制。
1.6.1 “按位与”运算符(&)
运算规则:参与运算的两个对象,按二进制位进行“与”运算。如果对应的二进制位都为1,则该位结果为1,否则为0。即:
0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1
例如,3 & 6 的结果为2.
0000 0011 (3) (&) 0000 0110 (6) ----------------------- 0000 0100 (2)
1.6.2 “按位或”运算符(|)
运算规则:参与运算的两个对象,按二进制位进行“或”运算。如果对应的二进制位都为0,则该位结果为0,否则为1。即:
0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1
例如,3 | 6 的结果为7.
0000 0011 (3) (|) 0000 0110 (6) ----------------------- 0000 0111 (7)
1.6.3 “按位异或”运算符(^)
运算规则:参与运算的两个对象,按二进制位进行“异或”运算。如果对应的二进制位相同时为0,不同时为1。即:
0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0
例如,12 ^ 5 的结果为9.
0000 1100 (12) (^) 0000 0101 (5) ----------------------- 0000 1001 (9)
1.6.4 “按位取反”运算符(~)
运算规则:(按位取反是一个单目运算符)参与运算为单个对象,用二进制位进行“取反”运算。当对应的二进制位为1,则该位结果为0,对应的二进制位为0,则该位结果为1。即:
~ 0 = 1 ~ 1 = 0
例如, ~ 13 的结果为242.
(~) 0000 1101 (13) ----------------------- 1111 0010 (242)注意:因为一个字节为8位,所以在取反运算时也要对8位都进行取反。
1.6.5 左移运算符(<<)
运算规则:用于将一个数的各个二进制位全部左移若干位,移出的高位均舍弃,低位则补0。
例如,3 << 2 的结果为12.
0000 0011 (3) (<< 2) ----------------------- 0000 1100 (12)
观察上面结果,发现左移2位,结果刚好比左移前大4倍,进而可以推出:将一个数左移n位,就相当于将该数乘以2^n次方(前提是没有发生“溢出”的情况)。
1.6.6 右移运算符(>>)
运算规则:用于将一个数的各个二进制位全部右移若干位,移出的低位均舍弃,高位一般补0(当该数为负数时,某些特殊情况会补1)。即:
例如,32 >> 2 的结果为8.
0010 0000 (32) (>> 2) ----------------------- 0000 1000 (8)
观察上面结果,发现右移2位,结果刚好比右移前小4倍,进而可以推出:将一个数右移n位,就相当于将该数除以2^n次方(前提是没有发生“溢出”的情况)。
1.7 其他运算符
1.7.1 逗号运算符
逗号运算符“,”是所有运算符中优先级别最低的。逗号运算符用来连接表达式。即:
表达式1,表达式2。
先求表达式1的值,再求表达式2的值,表达式2决定最终的值。
例如,设 a = 2 ,则 a *= a + 4,a * 4的求解过程为:
先求 a *= a + 4,得 a 的值为21。
再求 a * 4,得 a = 84。
故a的最终值为84。
1.7.2 条件运算符
条件运算符是C语言中唯一的三目运算符,由“?”和“:”两个运算符组成。其一般表达式为:
表达式1 ? 表达式2 : 表达式3
运算顺序为:先计算表达式1的值,若为真(非0),则计算表达式2的值,并将其作为整个表达式的值;如若表达式1的值为假(0),则计算表达式3的值,并将其作为整个表达式的值。
例如,求两个数中的更大的值
max = ( ( a > b ) ? a : b );当 a > b 时,会将变量 a 的值赋给 max ;反之,会将 b 的值赋给 max 。
1.7.3 sizeof运算符
sizeof是一个比较特殊的单目运算符,用来求得一种数据在内存中占多少个存储单元(字节),其一般使用形式为:
sizeof(变量或数据类型)
例如,计算一个整型变量所占内存:
int a = 1000;
printf("%d",sizeof(a));运行结果是4,一个整型int变量占4个字节。
1.8 常用运算符优先顺序
在一个表达式中,运算符优先顺序高的运算会优先计算,下面介绍常用的运算符优先顺序
1级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| ( ) | 圆括号 | (表达式)/函数名(形参表) |
| [ ] | 数组下标 | 数组名 [ 常量表达式 ] |
| . | 成员选择(对象) | 对象 . 成员名 |
| -> | 成员选择(指针) | 对象 -> 指针成员名 |
2级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| +/- | 正负号运算符 | ±表达式 |
| ++/-- | 自增减运算符 | ++变量名 / 变量名-- |
| * | 取值运算符 | *指针变量 |
| ! | 逻辑非运算符 | &变量名 |
| & | 取地址运算符 | !表达式 |
| ~ | 按位取反运算符 | ~表达式 |
| sizeof | 长度运算符 | sizeof(表达式) |
3级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| * | 乘 | 3 * 5 |
| / | 除 | 4 / 3 |
| % | 取模 | 5 % 2 |
4级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| + | 加 | 3 + 8 |
| - | 减 | 6 - 3 |
5级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| << | 左移 | 13 << 2 |
| >> | 右移 | 65 >> 3 |
6级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| 大于 | 表达式 > 表达式 | |
| >= | 大于等于 | 表达式 >= 表达式 |
| < | 小于 | 表达式 < 表达式 |
| <= | 小于等于 | 表达式 <= 表达式 |
7级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| == | 等于 | 表达式 == 表达式 |
| != | 不等于 | 表达式 ! = 表达式 |
8级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| & | 按位与 | 表达式 & 表达式 |
| 按位异或 | 表达式 ^ 表达式 | |
| | | 按位或 | 表达式 | 表达式 |
| || | 逻辑或 | 表达式 || 表达式 |
| && | 逻辑与 | 表达式 && 表达式 |
9级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| ? : | 条件运算符 | 表达式 ? 表达式 : 表达式 |
10级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| = | 赋值运算符 | 变量 = 表达式 |
| += | 加后赋值 | 变量 += 表达式 |
| -= | 减后赋值 | 变量 -= 表达式 |
| /= | 除后赋值 | 变量 /= 表达式 |
| *= | 乘后赋值 | 变量 *= 表达式 |
| %= | 取模后赋值 | 变量 %= 表达式 |
11级优先:
| 运算符 | 名称 | 使用形式 |
|---|---|---|
| , | 逗号运算符 | 表达式 , 表达式 |