运算符优先级:
单目(++,–,!,~,())>算术>(左移、右移)>关系>(&,^,|)>逻辑>条件>赋值>逗号
1.关系运算符:>,<,>=,<=,==,!= 运算结果为bool型*
2.逻辑运算符:!、&&、|| 运算结果为bool型
!逻辑非:真则为假,假则为真。
&&逻辑与:同真为真,否则为假(只要有一个假,则全部为假,否则为真)。先算前面的式子,前面式子为假,后面的式子不参与运算。
||逻辑或:有真为真,否则为假(只要有一个真,则全部为真,否则为假)。先算前面的式子,前面式子为真,后面的式子不参与运算。
3.条件运算符: ?:
a?b:c 如果a为真,结果b,否则为c
4、位运算:~,<<,>>,^,|,& 2进制补码的形式参与运算
~按位非:按位取反(0变1,1变0)
<<左移: 低位补0.
>>右移:正数高位补0,负数高位补1
&按位与:同1为1,否则为0
//按位与
/*
5补码 00000101
3补码 00000011
00000001 补码
判断一个正整数x是否为2的n次幂? !(x&x-1)
*/
cout << (5 & 3) << endl;//1
^按位异或:同则为0,异则为1
/*
不经过第三方变量交换两个整型变量的值
*/
int a=3, b=5;
//不会产生数据溢出
b = a^b;
a = a^b;
b = a^b;
cout << "a=" << a << ",b=" << b << endl;
|按位或:有1为1,否则为0
char c=10;
/*在进行位运算或赋值运算时注意整型提升
int型 4个字节=32位
x的原码: 0 0000000 00000000 00000000 00001010
反码:0 0000000 00000000 00000000 00001010
补码:0 0000000 00000000 00000000 00001010
<<2 0 0000000 00000000 00000000 00101000 补码(看成原码求补码)
反码 0 0000000 00000000 00000000 00101000
补码 0 0000000 00000000 00000000 00101000 补码的补码(原码)
40
m<<n结果为m*2的n次幂(没有数据溢出的情况下)
*/
cout << (c << 2) << endl;//40
c = c << 4;//c<<4=160 把160赋值变量c时,数据溢出
cout << (int)c << endl;//-96=160-256
运算符总则:
1.整型提升:
2.精度高为准
单目运算符(++,–、强转)>双目(算术运算符>赋值运算符>逗号运算符)
一、自增自减:自己(变量)本身+1或者-1
前置:++a,–a:先自加(减),再运算
后置:a++,a–:先运算,再自加(减)
总结:前置优先级低于后置;前置效率高于后置
运算法则:运算前,数前置;运算后,数后置。
二、赋值运算符:=,+=,*=…
1.左值必须是变量。
2.结合性:从右往左
3.右值必须看成一个整体
3.逗号运算符:,
由逗号运算符组成的式子,称为逗号表达式。
从左往右依次计算,最后一个式子的值,就是整个表达式的值。
4.强转: (类型)
1.把浮点型强转为整型,去掉小数部分。
2.整型强转为字符型,该整型作为ASCII码值对应的字符
原码:有符号的最高位表示符号位,其他位表示大小
反码:正数与原码相同,负数:符号位不变,按位取反(0->1,1->0)
补码:正数与原码相同。负数:反码+1
补码的补码就是原码
详情看原码反码补码
https://editor.csdn.net/md/?articleId=115379828