数据类型转换
规则:不同的数据类型参与运算,需要转换为同一类型后运算
数值比较由小到大简单排序:
隐式类型转换
说明:编译系统自动完成,一般是低优先级类型向高优先级类型转换,这种被称作自动类型转换
(由小到大)。
语法:大数据类型 变量名 = 小数据类型变量;
举例:
强制类型转换
说明:程序员自己实现,一般是高优先级类型向低优先级类型转换,这种被称作强制类型转换(由大 到小)
语法:小数据类型 变量名 = (小数据类型)大数据类型变量;
举例:
注意:强制类型转换过程中,可能会出现精度丢失的问题。如果大类型数据范围<= 小类型数据范围,此时数据不会丢失,正常转换;如果大类型数据范围 > 小类型数据范围,此时丢失超出部分的数据,精度会缺失!
原则:类型转换并不会改变原变量的类型。
运算符
算数运算符
单目运算符
说明:++ 、--、+(正)、-(负)、*(解引运算符)
++a与a++的区别
- ++在前,先自加1,后运算
-
++在后,先运算,后自加1
举例:
总结:
分析上面的案例,我们发现,不管是++在前,还是++在后,计算数自身都会+1。区别在于运算的结果不一样。++在前,先自加1,后运算;++在后,先运算,后自加1。
双目运算符
说明:+ - * / %
举例:
注意:
- 1.两个整数相除的结果是整数,小数部分被舍弃。要想其结果是实数,可在分子*1.0(隐式类型转换)
2.求模运算(取余运算)左右两边的操作数都必须是整型。如果是类似于3.0这样的数,是错误的。
三目运算符
语法:表达式1?表达式2:表达式3
求值顺序:如果表达式1的值为真,则整个条件运算表达式的值为表达式2的值;
如果表达式1的值为假,则整个条件运算表达式的值为表达式3的值;
关系运算符
说明:< > >= <= != ==
案列:
什么是表达式?
表达式就是表达某种意思的式子。在C语言中,表达式指的是 运算符连接操作数(变量|常量)的式子。
注意:
由关系运算符构成的表达式称为关系表达式,关系表达式的值为boolean(布尔值)
非0 :关系成立,为真
0 :关系不成立,为假
逻辑运算符
说明:&&与 ||或 !非
1.&&逻辑与(且),符号两边的操作数都为真,结果才为真。
2.||逻辑或(或),符号两边的操作数只有有一个为真,结果就为真
3.!逻辑反(取反),取反,非0为真
所谓的惰性运算,就是减少运算次数。
短路与:&&两边的操作数,只要左边不成立,直接返回假,不再校验右边。
短路或:||两边的操作数,只要左边成立,直接返回真,不再校验右边。
注意:
算数运算符,运算结果是数值类型
关系运算符,逻辑运算符,运算的结果是boolean类型(其实就是int的0假,非0真)
位运算符
说明:按位(bit)来进行操作的运算符。
语法:~ & | ^ << >>
~:按位取反
说明:单目运算符,数据的每一个bit位取反,也就是二进制数位上的1变0,0变1。
举例:
unsigned char ret = ~0x05;//000 0101 -->1111 1010
printf("%d\n",~5);//
&:按位与
语法:a & b
说明:首先将参与计算的操作数转换为二进制,然后按照每一位对齐,处理结果如下:
总结:如果我们前后两个操作数对齐位置上的二进制数字都是1,其结果为1,否则结果都是0.
|:按位或
语法:a | b
说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:
总结:如果我们前后两个操作数对齐位置上的二进制数字只要有1,其结果为1,否则结果都是0.
^:按位异或
语法:a ^ b
说明:
首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:
总结:相同为假,不同为真
<<:左移,按bit位往左偏移
1.无符号左移:
语法:操作数 << 移动位数(bit位)
unsigned int a = 3 << 3
printf("%d\n",a);//24
2.有符号左移
语法:操作数 << 移动位数(bit位)
int a = -3 << 3;
printf("%d\n",a);//-24
>>:右移,按bit位往右偏移
1.无符号右移:
操作数 >> 移动位数(bit位)
2.有符号右移:
操作数 >> 移动位数(bit位)
案列:
需求:将一张BMP图片显示到开发板的LCD屏幕上
说明:
屏幕显示:BGR
图片显示:RGB
实现:RGB --> BGR
B:右移0个字节,也就是移动0位 B >> 0
R:右移2个字节,也就是移动16位 R >> 16
G:右移1个字节,也就是移动8位 G >> 8
总结
注意:
1.在进行移位运算时,凡是被移出去的位统统丢弃,凡是空出来的位统统补0.移位运算针对的是无符号整数。
2.如果非要进行有符号的移位运算,那么左移的时候,空出来的补0;右移的时候,空出来的补符号位(原码阶段)。
其它运算符
赋值运算符
语法:=
=:由右 - >左 ,优先级排倒数第二
注意:赋值运算符的左边(左操作数)必须是可写地址
复合赋值运算符
语法: += -= *= /= %=,由右 - > 左,优先级排倒数第二
sizeof(int)
说明:用来计算某种类型或者变量所占的字节数(中英文字符集问题,不标准)
逗号运算符(,)
说明:优先级最低,左->右,由多个运算符将多个不同的式子连接起来的表达式称之为逗号表达式。
语法:(表达式1,表达式2...表达式n)
注意:
1.逗号表达式的优先级最低
2.运算顺序从左往右
3.整个逗号表达式的值取决于最右边的表达式的值
举例:
优先级的顺序
常见的运算符优先级从高到低依次为:
1. 单目运算符(如自增、自减、取反等)
2. 算术运算符(如乘法、除法、加法、减法等)
3. 关系运算符(如大于、小于等)
4. 逻辑运算符(如与、或、非等)
5. 赋值运算符(如赋值号"=")