位运算
针对以bit为基本单位的运算
&|^ ~
移位运算
<< :逻辑运算:每个bit 依次左移 最高位丢弃 最低补0
逻辑左移n位 ,相当于*2^n
比乘法运算效率高很多
>>:算数右移:每个bit依次右移 最低位丢弃 最高位补符号位
算数右移n位 相当于/2^n
比除法运算效率高很多
取地址运算符和解引用运算符
&:取变量的地址
&a
*,*&a取得a对应内存中的数据 等价于a
条件运算符(三目运算符)
语法格式:D=条件表达式A?表达式B:表达式C;
语义:如果A为真 D=表达式B
如果A为假 D=表达式C
运算符优先级(先算谁后算谁)
简单的看
int a = 2 + 5 * 3;
int a = (2 + 5) * 3;
int a = ((2 + 5) * 2) * 3;
结论:()它的优先级是最高的,()中的内容一定先被计算,()容许嵌套使用
详细的看
1)运算符之间是有优先级之分
int b = 5 + a<<2;
2)想先算的,搞不清优先级的 加() 万能方法
int b = 5 + (a<<2);
3)建议大概记忆优先级顺序,尽量记,记住多少算多少
单目运算符>算数运算符>移位运算符>关系运算符>逻辑运算符>赋值运算符
单目运算符:! ~ ++ -- &(取地址)
!a
a + b (双目运算符)
算数运算符:+ - * / %
移位运算符: << >>
关系运算符: > < == != >= <=
逻辑运算符: && || !
赋值运算符: = += -= *= /= %=
左右结合性(能掌握最好,不能就算了)
左结合:
m = a - b + c;// (a-b)+c
右结合:
int a = b = c;//a=(b=c)
数据类型的转换
隐式转换
特点:表达式中出现的数据类型不同,编译器会自动将不同的数据类型,转换成相同的数据类型,再做运算
三种形式:
1)会将占内存 空间小的类型 转换成占内存空间大的类型
int a = 0, c = 0;
char b = 2;
c = a + b; //将b类型由char类型提升为int类型 然后再做运算
b) 运算时既有整型类型 又有浮点类型
编译器会自动将整型类型 转换为 浮点类型 再做运算
printf("sizeof(1?1:0.9)的结果是%d\n", sizeof(1?1:0.9)); // 8
c) 运算时既有无符号数据类型又有有符号数据类型
编译器会自动将有符号类型转换为无符号类型 再做运算
总结:
1)规律:短转长 整转浮 有转无
2)经验:尽量不要使用隐式转换
强制转换
1)强制转换的语法的格式
目标类型变量 = (目标类型)源类型变量
例如:
char a = 35;
int b = a;//隐式转换
int b = (int)a;//强制转换 先将a转换为字节数据 再去赋值给b
2)注意强制转换可能造成数据丢失
int n = 300; /*0000 0000 0000 0000 0000 0001 0010 1100*/
char m = (char)n;/*0010 1100*/
printf("m=%hhd\n", m);//44
长转短 不管是强制转换还是隐式转换 都会造成数据丢失 实际编程有时候就需要高位字节干掉
3)不管是隐式转换还是强制转换都不会改变变量本身的值