继续运算符及流程控制
priority:优先级
回顾:
1.公式:
位清0:A &=~(B<<C)
位置1:A|=(B<<C)
对多位操作时,综合两者使用,可以先将目标位清0,再通过|=插入需要的二进制数
1 | int a=0xaacc7654; |
以上例子:把cc位变为aa
今天:
1.条件运算符
a?b:c
2.运算符优先级
1 | a=(1>2)&&(2<3);//写括号,提高代码可读性 |
3.数据类型的转换:隐式转换和强制转换
3.1隐式转换特点:如果表达式中不同数字的数据类型不同,gcc编译器自动先将不同的数据类型转换成相同的数据类型之后再做运算
隐式转换三种情形:
运算表达式中存在多种数据类型时
a)gcc会把占内存小的类型转换成占内存大的类型
例子:
1 | int a=0; |
b)如果有整型数据类型和浮点数类型,gcc会把整型数据转换为浮点数类型
c)如果既有有符号数,又有无符号数,gcc编译器会自动将有符号数转换为无符号类型
d)不推荐使用隐式转换,代码可读性差
e)规律:小转大,整转浮,有转无(符号)
注意:
1.sizeof(1?1:0.9);//结果是8 这里浮点数和整型类型都有,隐式转换,double为8字节
2.问题:这个的结果不该是一个很大的数吗(2^32—7),为什么我的输出都是-4
1 | int main(void){ |
解答:这里的占位符有问题,%d的输出要求把3u转成int了,应该为%u
3.2强制转换(推荐使用,目的:提高代码可读性)
a)语法:目标类型变量=(目标类型)源类型变量
例如:char a=90;
int b=a;//隐式转换
int b=(int)a;//强转为int类型
b)注意:强转可能会造成数据的丢失
例如:
1 | int a =300; |
为什么:
300正向溢出了边界,溢出173,由于是正向,从左边界开始结算,所以结果是-128+173=45,是从0开始的第45个
所以是44
所以:强转数据类型转换都是小转大,或者相等转(意思是这两种可以被允许),隐式转换也遵循此规则,否则也会数据丢失
c)不管哪种类型转换都不会改变变量本身值
c语言流程控制
1.明确:c程序是一个结构化程序,由顺序结构、分支结构、循环结构构建的单入口(main)和单出口的程序(return 0);
2.分支结构:
1 | int a=1; |
注意:
gcc编译器默认不链接math库,我们在编译时要手动链接
分步式:test.c
1 | gcc -E -o test.i test.c; |
懒人式:
1 | gcc -o test test.c -lm; |