- 运算符
1).[] () . ->
2).单目运算符
+正号
-负号
++自家
–自减
& 取地址 (指针)
’* ‘取值 (指针)
!取非 (非零为真,零为假)
~ 取反 按位取反
(类型) 强制类型转换 比较危险,能不用就不用
sizeof 求大小
3).算数运算符
‘+’ 加
‘-’ 减
‘*’ 乘
/ 除法 取整
% 取余
双目运算符 % 操作数(‘int’和‘double’)无效
4).移位运算符
’>>‘ 右移
’<<‘ 左移 如果移动的过了,把1会移没,也可能会移成负数
左移不管是正数还是负数,都是缺位补零
右移正数时,高位补零,负数时,高位补一 --> 右移时,符号位是什么,就补什么
1 << 1 2
1 << 2 4
1 << 3 8
1 * 2^n
16 >> 1 8
16 >> 2 4
16 >> 1 2
16 / 2^n
适用场景:设置寄存器
GPX1_DATA _ _ _ _ _ _ _ _ pit 1 << 4
1 << 4
0000 0001
0001 0000
5).关系运算符
> 大于
< 小于
== 等于
!= 非等于
>= 大于等于
<= 小于等于
6).按位
& 与
1 & 0 -->0
1 & 1 -->1
0 & 1 -->0
0 & 0 -->0
使用场景:清0
GPX1_DATA 0011 0000
& 1110 1111
————————————
0010 0000
1 << 4
0000 0001
~ 0001 0000
___________________
1110 1111
问题:把GPX_1DATA的bit 4 位置为1
GPX1_DATA & 1110 1111 //小白
GPX1_DATA & ~(1 << 4) //比较好
| 或
1 | 0 -->1
1 | 1 -->1
0 | 1 -->1
0 | 0 -->0
问题:把GPX_1DATA的bit6置1
|(1<<6)
^ 异或 相同为0 不同为1
1 ^ 0 -->1
1 ^ 1 -->0
0 ^ 1 -->1
0 ^ 0 -->0
~ 取反
7).逻辑操作 && || !
&& 与
表达式1 && 表达式2
真1 真1 真1
假0 真1 假0
真1 假0 假0
a > b && a > c
|| 或
表达式1 ||表达式2
真1 真1 真1
真1 假0 真1
假0 真1 真1
假0 假0 假0
! 非
非假为真
非真为假
&& || 取短操作 只要能够确定整个表达式是真还是假,就不再往下执行,不论括号,先左后右
int a = 3,b =6,c;
c=a<b||(a=8);
printf("%d\n",a); //3
printf("%d\n",c); //1
c=a>b||(a=0);
printf("%d\n",a); //0
printf("%d\n",c); //0
c=a<b&&(a=8);
printf("%d\n",a); //8
printf("%d\n",c); //1
c=a>b&&(a=8);
printf("%d\n",a); //3
printf("%d\n",c); //0
作业:利用异或实现两个数的交换 a = 3, b = 4; --> a = 4 b = 3;
a 0011 b 0100 a = a^b; b =a^b; a=a^b;
a =a ^ b
a 0011
b 0100
-------------
a: 0111
b = a ^ b
a 0111
b 0100
------------------
b 0011 =a(原)
a = a^b
a 0111
b 0011
--------------------
a:0100 = b(原)
方法 2
a = a * b;
b = a / b;
a = a / b;
8).条件运算符 (三目运算符)
? :表达式1?表达式2:表达式3
a > b ? a = 8 : b = 9 ;
1.判断 a > b ;
2.是:a = 8;
否:b = 9;
如果a为真,则将b赋给d,如果a为假,则将b赋给d。
适用场景:
1.队列是否为满: 满 1 ,不满 0;
queue == 满? 1:0
a > 8 ? 1 : 0
2.取最大值:
max = a > b ? a : b ;
9).赋值运算符
= 赋值
+=
a += b; ===> a = a + b;
-=
a -= b; ===> a = a - b;
*=
/=
%=
>>=
<<=
10 )逗号运算符
可以有多个表达式,每个表达式中间以逗号分 隔,最终结果为最后一个表达式的值
tmp = (a = 8,b = 9,c = 20);
printf(“a= %d,b = %d,c = %d,tmp = %d\n”,a,b,c,tmp);
//a = 8,b = 9,c = 20,tmp = 20
优先级:单算移关与,异或逻条赋,逗号 单,条,赋 从右向左结合。