操作符和表达式
本章重点:
1
、操作符介绍
2
、表达式求值
(
1
)操作符
1.
算术操作符
+ - * / %
除了
%
操作符之外,其它的几个操作符可以作用于整数和浮点数
对于
/
操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法
%
操作符的两个操作数必须为整数,返回值为整除之后的余数
2.
移位操作符
移动的是二进制,数据在内存中以补码的形式进行保存。
正整数的原码、反码、补码相同。
负数原码的首位是1,反码在原码基础上,符号位不变,其余位取反,补码在反码基础上加一。
<<
左移操作符
移位规则:左边抛弃,右边补
0
<< 相当于*2
>>
右移操作符
右移运算分两种:
1>逻辑移位:右边丢弃,左边用0填充
2>
算术移位:右边丢弃,左边补符号位(相当于/2)
对于移位运算符,不要移动负数位,这个是标准未定义的。
3.
位操作符
&
按位与
|
按位或
^
按位异或
Tips
:操作数必须是整数。
(
2
)表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定的。
有些表达式的操作数在求值的过程中可能需要转换为其他类型。
隐式类型转换
C
的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和
short
操 作数在使用之前被转换为普通整型,这种转换称为整型提升
。
表达式中可以使用整数的地方,就可以使用枚举类型,或有符号或无符号的字符、短整 数、整数位域。如果一个int
可以表示上述类型,则该值被转化为
int
类型的值;否则,该值被转化为 unsigned int类型的值。这一过程被称作
integral promotion
。
整型提升的意义:
表达式的整型运算要在
CPU
的相应运算器件内执行,
CPU
内整型运算器
(ALU)
的操作数的字节长度一般就是
int
的字 节长度,同时也是CPU
的通用寄存器的长度。
因此,即使两个
char
类型的相加,在
CPU
执行时实际上也要先转换为
CPU
内整型操作数的标准长度。
通用
CPU
(
general-purpose CPU
)是难以直接实现两个
8
比特字节直接相加运算(虽然机器指令中可能有这种字 节相加指令)。所以,表达式中各种长度可能小于int
长度的整型值,都必须先转换为
int
或
unsigned int
,然后 才能送入CPU
去执行运算。
操作符的优先级:
在了解了操作符的优先级之后,有些人就可能会突发奇想,写出一些稀奇古怪的表达式,写出来不仅是坑自 己,也是坑队友!