运算符易错、细节总结

运算符易错、细节总结

一、运算符的优先级

初等运算符:[ ]、( )、->、.
单目运算符:-、强制转换、++、- - 、*、&、!、~、sizeof
算术运算符:先乘除,后加减
位运算符中的位移运算符:<<  、>> 
关系运算符:
位运算符:(除位移运算符外)
逻辑运算符:(除逻辑非外)
条件运算符:
赋值运算符:(包含赋值复合运算符)

注意:
1、自增、自减运算符优先级高于乘除
2、->和.的优先级高于*和&
3、算术运算符中的加减优先级高于位移运算符
4、常用:逻辑!> 算符运算符 > 关系运算符 > 逻辑&&、||  > 赋值运算符

二、逻辑运算符的短路特性

1、逻辑&&的逢0短路特性:
	表达式1 && 表达式2 ,如果表达式1的值为零,则整个表达式的值为零,表达式2不会执行。
	int a = 0, b = 1;
	c = a++ && b++;
	结果:c = 0, a = 1, b = 1;
	
	分析:
	c = a++ && b++  <==> c = (a++) && (b++);后置++,则a++的结果为0,表达式b++不执行。

2、逻辑||的逢1短路特性:
表达式1 || 表达式2,如果表达式1的值为1,则整个表达式的值为1,表达式2不会执行。
int a = 1, b = 2;
c = a++ || b++;
结果:c = 1, a = 2, b = 2;

三、位运算符

	位运算符多用于寄存器内的控制,它的运算是以内存中存放的二进制码为前提。
	
	1、按位异或^
	格式:表达式1 ^ 表达式2 
	功能:对应的二进制位相同为0,不同为1。
	特点:unsigned char data = 0x13
			   data ^ 0 =data;//无符号整数与0求异或得其本身
			   data ^ data = 0;//无符号整数与自身求异或得0
//利用异或实现两个数的交换:
#include stdio.h>    
int main()
{
	int a = 10, b = 20;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a = %d, b = %d\n", a,b);
	return 0;
}
结果:a = 20, b = 10;
分析:利用交换律:b = a ^ b = (a ^ b) ^ b = a;
				a = a ^ b = (a ^ b) ^ a = b;
2、位移位运算符(低于算术运算符的加、减)
1)左移:<< 
左移是高位丢失,低位补0。左移一位数据扩大一倍

2)右移:>>
右移是低位丢失,高位需要进行补位。正数高位补0,负数高位补1。右移一位数据缩小一倍。

例:
5            0101
>>2        0001
右移两位,数据缩小四倍。5/4=1

3、思考:如果将一无符号的数据的某位快速置1,如何将某一无符号的某位快速置0。
口诀:清0取反要用与,某位置1要用或
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值