C语言(3)运算符及其优先级

  1. 运算符

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

优先级:单算移关与,异或逻条赋,逗号 单,条,赋 从右向左结合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值