运算符(秋六周、冬一周)
1.二进制运算符
<< >>左移右移
格式:a<<b,b必须是正数,左移时低位补0;右移时正数补0,负数补1
位移运算不改变原变量,需要重新赋值
符号数移位注意点
符号数在移位时,负数右移高位补1
&与运算,|或运算,^异或运算,~取反
&与运算是指将两数二进制每一位数进行与运算得到一个新的数,与运算是两个数有一个0则最终结果为0。
|或运算是指将两数二进制每一位数进行或运算得到一个新的数,或运算是两个数有一个1则最终结果为1。
^异或运算是指两数二进制每一位数进行异或运算得到一个新的数,异或运算是指相同输出0,不同输出1,我的记忆方法是差的绝对值
~取反是单目运算符,是指将该数的二进制数的每一位数取反
使用这些运算可以达到一些目的
如一个八位二进制数a,a&0111 1110可以把最高位和最低位变成0,其余不变;
a|1000 0001,可以把最高位和最低位变成1,其余不变;
a^1000 0001,可以将最高位和最低位取反。
异或可逆特性
c=a^b, 则b=a^c
2.逻辑运算
逻辑运算中,0为假,非0数均为真。
&&短路性:a && b,若a为假,程序不会判断b的真假,即使b语句可能会报错或无法判断,程序也直接输出假,而后面语句若有赋值运算符,也不会执行
||短路性: a || b,若a为真,程序不会判断b的真假,即使b语句可能会报错或无法判断,程序也直接输出真,而后面语句若有赋值运算符,也不会执行。
优先级:!>&&>||
3.运算符优先级与结合性
记忆方法:初等>单目>运算>移位>关系>位逻辑>逻辑运算>三目>赋值>逗号
优先级从上到下,第二优先级的*表示指针
left to right表示左结合,right to left表示右结合
=赋值运算是右结合,所以z=(y=x+2)中,(y=x+2)中y的值被赋为右边的值,即x+2的值
赋值运算过程:
(1)计算赋值运算符右侧表达式的值
(2)将赋值运算符右侧的值赋给赋值运算符左边的变量
(3)将赋值运算符左边的值作为赋值表达式的值
int n=3.14*2,n被赋值为6,表达式返回6。
++x与x++
++x与x++都能将变量x+1,但++x返回x+1的值,x++返回x的值
一个注意点
因为(-x)++的意思是-x=-x+1,而-x不是一个变量,故报错
不是变量的数都不能在等号左边
若y=-(x++),则先执行x++返回x,再取相反数
4.其他运算符
复合赋值运算符
都是右结合,先计算右边,再赋值给左边
逗号运算符和逗号表达式
逗号表达式的值等于最后一个表达式的值
例:
int x=0, y=2, z=3;
x=(y+=2, z++, y+=z);
本例中,x最后被赋值为8,同时y,z的值都改变
sizeof
求某种类型宽度
条件运算符 ? :
条件运算符是三目运算符
max= a>b ? a : b
max会赋值为a,b中较大值
意识是?左边条件符合(为True),返回值为冒号左边的值,条件不成立则返回冒号右边的值
? : 是右结合性,
例子
a>0 ? 1 : a<0 ? -1 : 0;
本例中,先做(a<0 ? -1 : 0)
右结合运算符共三类:=、?:、优先级排第二的所有运算符