跳转至

运算符(秋六周、冬一周)

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)

右结合运算符共三类:=、?:、优先级排第二的所有运算符