Linux C 学习第三天(类型转换&运算符)

类型转换:
1.自动转换:
运算过程中,运算符两边类型不相同就会自动转成较大的类型进行运算.
2.赋值转换:
赋值运算的过程中产生的转换,=号左右两边的类型不相同,则发生转换.
char int float double
char <-->int
int --> char 4B -->1B
char类型只有一个字节,int有四个字节,赋值时直接将int的内存的低一个字节截断给char 变量;
char --> int
将一个字节赋值给4个字节,直接将char的8位复制给int的低8位,高24位采取补0或补1的方法.
有符号类型的最高位为1,则24位补1.其他情况都补0;这样能保证数据变量.
不关心整型是否有符号.
int <-->float
float --> int
直接将float的整数部分赋值为int变量,小数丢弃.要保证整数部分不能超出int的范围.
int a = 3.14159; //a = 3;
int --> float
数据不变,改变数据的存储方式为float的方式.数据的精度可能会丢失。
float <-->double
float --> double
数据不变,改变数据的存储方式.
double --> float
数据尽量不变,改变数据存储方式.可以直接将double的十进制数据截取前面7位有效数据给float变量.
如果数据过大,报溢出错误,inf
3.强制转换:
按照开发者的需求进行指定的转换.
转换格式:
(目标类型)变量;
float a 2.5;
2+(int)a

运算符:
表达式:
运算符表:
优先级
结合性
1.老大
()、[]、
2.单目:
++、--自加 自减。
a = 5;
b = a++; //先赋值后自加,b = a, a++ 之后b==5, a==6;
a = 5;
b = ++a; //先++,后赋值 ++a, b=a 之后b==6, a==6
int a = 5, b = 7, c;
c = a++ + b; //12 期望值:a+期望得到另一个+ 。
c = a++ + ++b; //13
a = 5;
c = a++ + a++ + a++;
sizeof() 伦家是运算符,不是函数,求类型或变量占用内存大小
int a = 668;
sizeof(int) ==> 4; //int在内存中的大小为4个字节
sizeof (a) ==> 4; //a在内存中占用4个字节
3.算术
* 乘法
/ (除法或取整) 除法两边都是整数,则进行取整运算. 否则进行除法运算
5/2 ==> 2 2/5 ==> 0
5/2.0 ==> 2.500000
1.0*7/2 ==> 3.500000
7/2*1.0 ==> 3.000000
% 求余/求模运算 (左右操作数必须为整数)
5%2 ==> 1
3%5 ==> 3
+
-
4.位移运算 --(位操作是对内存的直接操作)
<<
char a = 0x1;
b = a<<1; 表示将a中的数据左移一位后给b,后边补0,最高位丢弃.
左移N位,相当于乘以2的N次方(数据不丢失)
>>
char a = 0x60;
b = a>>1 表示将a 中的数据右移一位后给b,左侧补0,最低位丢弃.
右移相当于除以2(数据位不可丢失)
char a = -4;
b = a>>1; 表示将a中的补码数据右移一位后给b,左侧补1(算术右移),最低位丢弃.
Ps:
有符号类型的最高位为1;
5.关系运算
关运算的结果是一个逻辑值,表示判断结果的真假,0为假,1为真,非零即真
< > <= >=
a = 5>6 ;假,a = 0;
a = 6>5; 真,a = 1;
== !=
6.位运算
& | ^
位&: 按位与,两者都为1,则结果为1
x & 1 ==>x 不变
x & 0 ==>0 清零
位或|:按位或,两者都为0,则结果为0
x | 1 ==>1 置一
x | 0 ==>x 不变
异或^:按位异或,两者不同,则结果为1;
x ^ 1 ==>~x 取反
x ^ 0 ==>x 不变
交换两个数:
int a = 5, b = 7;
a = a^b;
b = a^b;
a = a^b;
7.逻辑运算
结果为真假值
&& 逻辑与
表达式1 && 表达式2 表达式1和表达式2都为真则为真.
短路现象:
表达式1为假,则整个表达式为假,不会判断表达式2
(表达式1)+(表达式2) ://表达式1和2的运算符都是+,等级相同,没有先后顺序,由编译器决定
(表达式1)&&(表达式2)://对于&&,存在求值顺序,即先计算表达式1。
|| 逻辑或
表达式1 || 表达式2 表达式1或表达式2只要有一个为真则为真.
0 || 1 1
1 || 0 1
0 || 0 0
1 || 1 1
短路现象:
表达式1 || 表达式2 表达式1为假才继续判断表达式2
! 逻辑非
!(表达式) 真变假,假变真
优先级表:
优先级:
是为了解决 不同运算符 之间的资源归属问题,变量总是和优先级高的结合成一个整体;
a + b * c //b和*结合成b*c构成一个整体==> a + (b*c)
结合性:
是为了解决 相同运算符 之间的资源归属问题.
1.0*5/2
求值顺序:
解决单个运算符运算时,左右表达式执行先后顺序的.(一下三个运算符是有求值顺序的:
&&, ||, a?b:c)
(表达式1) && (表达式2); //求值顺序决定了表达式1先算.
a?b:c; //表达式a先算,然后再判断执行b或则c
(表达式1) + (表达式2); //表达式1和表达式2,先后顺序不确定.
小练习:共-25 错题-4
预习:
条件运算符
输入和输出函数
Linux C 学习第三天(类型转换&运算符)

猜你喜欢

转载自blog.csdn.net/nan_lei/article/details/81005385