前言
欢迎关注我的专栏:C语言语法知识
算术操作符
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
算术操作符比较简单,要注意的点有:
1、对于 / 操作数都为整数时执行整数出发,有一个及以上的操作数是浮点数时,执行小数除法。
2、对于%,两边的操作数必须是整数。
移位操作符
>> | 右移操作符 |
<< | 左移操作符 |
将1右移5位
1 >> 5
将1左移5位
1 << 5
移位操作符的操作数必须是整数。
左移操作符的移位规则
左边舍弃,右边补零。
右移操作符的移位规则
右移操作符的移位规则分为两种,一种是算术移位,另一种是逻辑移位。
具体用什么规则,取决于编译器。
算术移位
右边丢弃,左边用符号位填补
逻辑移位
右边丢弃,左边补零。
位操作符
这里为“位”指的是二进制位。
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
按位与
有零则零。
按位或
有一则一。
按位异或
相同为零,相异为一。
赋值操作符
+= |
-= |
*= |
/= |
%= |
>>= |
<<= |
&= |
|= |
^= |
a %= b等价于a= a%b
单目操作符
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址符 |
sizeof | 求操作数的类型长度(以字节为单位) |
~ | 按位取反(对一个数的二进制形式) |
-- | 前置--,后置-- |
++ | 前置++,后置++ |
* | 间接引用操作符(解引用操作符) |
(类型) | 强制类型转换 |
关系操作符
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
== | 等于 |
逻辑操作符
&& | 逻辑与(并且) |
|| | 逻辑或(或者) |
条件操作符
exp1 ? exp2: exp3 |
exp1是否为真?是则执行exp2,否则执行exp3.。
(exp为表达式)
逗号表达式
exp1,exp2,exp3,...
以最后的表达式结果作为整个逗号表达式的结果。
下标引用操作符、函数调用操作符、结构成员访问操作符
【】 | 下表引用操作符 |
() | 函数调用操作符 |
. | 结构体成员访问操作符 |
-> | 结构体成员访问操作符(适用于结构体指针) |
表达式求值
隐式类型转换
C 的整型算术运算总是至少以缺省整型类型(int类型)的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为 整型 提升 。
整型提升的意义
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
整型提升的方式
高位补充符号位。
算术转换
long double
double
float
unsigned long int
long int
unsigned int
int
(由低到高转换(int->long double))
操作符的属性
复杂表达式的求值有三个影响的因素。1. 操作符的优先级2. 操作符的结合性3. 是否控制求值顺序。两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
总结
介绍了算术操作符、移位操作符、位操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下表引用操作符、函数调用操作符、结构成员访问操作符、赋值操作符、整型提升、算术转换。