运算符易错、细节总结
一、运算符的优先级
初等运算符:[ ]、( )、->、.
单目运算符:-、强制转换、++、- - 、*、&、!、~、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要用或