算数操作符
+ - * / %
- 对于+ - * /的操作数可以为整数,也可以是浮点数。
- 对于 / 操作符,如果两个操作数均为整数,则进行整数除法;如果其中一个操作数为浮点数,则进行浮点数除法。
- 对于%操作符的操作数需为整数,计算后返回为两个数整除之后的余数。
移位操作符
左移操作符<<
将操作数在内存储存的补码进行向左移位,移位方式左边抛弃、右边补0。
右移操作符>>
右移运算分为两种:
- 逻辑移位:左边用0填充,右边丢弃。
- 算术移位:左边用原该值的符号位填充,右边丢弃。
大部分的编译器采取算数移位的方式。
- 移位操作符的操作数不能是负数。
赋值操作符
对一个变量进行赋值,需要赋值的变量为左操作数,赋的值为右操作数。
符合赋值符
很多运算符都可以写成复合的效果:+= 、 -= 、 *= 、 /= 、 %= 、 >>= 、 <<= 、 &= 、 |= 、 ^=
单目操作符
操作符 | 作用与含义 |
---|---|
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
- - | 前置、后置- - |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
关系操作符
操作符 | 作用与含义 |
---|---|
> | |
>= | |
< | |
<= | |
!= | 用于测试“不相等” |
== | 用于测试“相等” |
逻辑操作符
操作符 | 作用与含义 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
- 几个表达式由逻辑与相连接时,如果第一个式子为真,则整个表达式为真,且之后的式子不进行计算
- 几个表达式由逻辑或相连接时,如果第一个式子为假,则整个表达式为假,且之后的式子不进行计算
条件操作符
exp1 ? exp2 : exp3
唯一的一个三目操作符,当表达式exp1为真时,进行表达式exp2,反之进行表达式exp3。
逗号表达式
一连串有逗号连起来的表达式,计算时从左到右,整个表达式的结果是最后一个表达式的结果。
下标引用、函数调用和结构成员
- [ ]下标引用操作符
包含两个操作数,一个是数组名,一个是索引值,即数组下标。 - ( )函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数是传递给函数所需要的参数。 - 访问结构体成员
.结构体.成员名
->结构体指针->成员名
操作符优先级
- 以下摘自《C和指针》
操作符 | 描述 | 用法示例 | 结果类型 | 结合性 | 是否控制求值顺序 |
---|---|---|---|---|---|
( ) | 聚组 | (表达式) | 与表达式同 | N/A | 否 |
( ) | 函数调用 | rexp(rexp,…,rexp) | rexp | L-R | 否 |
[ ] | 下标引用 | rexp[rexp] | lexp | L-R | 否 |
. | 访问结构成员 | lexp.member_name | lexp | L-R | 否 |
-> | 访问结构指针成员 | rexp->member_name | lexp | L-R | 否 |
++ | 后缀自增 | lexp++ | rexp | L-R | 否 |
- - | 后缀自减 | lexp- - | rexp | L-R | 否 |
! | 逻辑反 | ! rexp | rexp | R-L | 否 |
~ | 按位取反 | ~rexp | rexp | R-L | 否 |
+ | 单目,表示正值 | +rexp | rexp | R-L | 否 |
- | 单目,表示负值 | -rexp | rexp | R-L | 否 |
++ | 前缀自增 | ++lexp | rexp | R-L | 否 |
- - | 前缀自减 | - -lexp | rexp | R-L | 否 |
* | 间接访问 | *rexp | lexp | R-L | 否 |
& | 取地址 | &lexp | rexp | R-L | 否 |
sizeof | 取其长度,以字节表示 | sizeof rexp sizeof(类型) | rexp | R-L | 否 |
(类型) | 类型转换 | (类型)rexp | rexp | R-L | 否 |
* | 乘法 | rexp * rexp | rexp | L-R | 否 |
/ | 除法 | rexp / rexp | rexp | L-R | 否 |
% | 整数取余 | rexp % rexp | rexp | L-R | 否 |
+ | 加法 | rexp + rexp | rexp | L-R | 否 |
- | 减法 | rexp - rexp | rexp | L-R | 否 |
<< | 左移位 | rexp << rexp | rexp | L-R | 否 |
>> | 右移位 | rexp >> rexp | rexp | L-R | 否 |
> | 大于 | rexp > rexp | rexp | L-R | 否 |
>= | 大于等于 | rexp >= rexp | rexp | L-R | 否 |
< | 小于 | rexp < rexp | rexp | L-R | 否 |
<= | 小于等于 | rexp <= rexp | rexp | L-R | 否 |
== | 等于 | rexp == rexp | rexp | L-R | 否 |
!= | 不等于 | rexp != rexp | rexp | L-R | 否 |
& | 位与 | rexp & rexp | rexp | L-R | 否 |
^ | 位异或 | rexp ^ rexp | rexp | L-R | 否 |
| | 位或 | rexp | rexp | rexp | L-R | 否 |
&& | 逻辑与 | rexp && rexp | rexp | L-R | 是 |
|| | 逻辑或 | rexp || rexp | rexp | L-R | 是 |
? : | 条件操作符 | rexp ? rexp : rexp | rexp | N/A | 是 |
= | 赋值 | rexp = rexp | rexp | R-L | 否 |
+= | 以…加 | rexp += rexp | rexp | R-L | 否 |
-= | 以…减 | rexp -= rexp | rexp | R-L | 否 |
*= | 以…乘 | rexp *= rexp | rexp | R-L | 否 |
/= | 以…除 | rexp /= rexp | rexp | R-L | 否 |
%= | 以…取模 | rexp %= rexp | rexp | R-L | 否 |
<<= | 以…左移 | lexp <<= rexp | rexp | R-L | 否 |
>>= | 以…右移 | lexp >>= rexp | rexp | R-L | 否 |
&= | 以…与 | lexp &= rexp | rexp | R-L | 否 |
^= | 以…异或 | lexp ^= rexp | rexp | R-L | 否 |
|= | 以…或 | lexp |= rexp | rexp | R-L | 否 |
, | 逗号 | rexp, rexp | rexp | L-R | 是 |
- lexp表示左值表达式,rexp表达右值表达式。
- 左值意味着一个位置,而右值意味着一个值。所以,在使用右值的地方也可以使用左值,但是使用左值的地方不能使用右值。