在今日的学习中,学习变量赋初值,算数运算符以及各类数据的混合运算,还有不同类型的变量间的混合赋值
变量赋初值
在进行变量的定义时 可以进行初始化,在为变量在内存中开辟新空间后附上数值。
与定义完在进行赋值的操作不同的是可以减少运行时间,定义时不进行初始化是在内存开辟空间后赋给随机值,随后在进行赋值,相比之下,初始化则能更加高效。
运算符与结合性
在c语言中算数运算符有优先级
在优先级1中,我们经常用到(),这和我们学的数学是一样的
接下来优先级2的是单目运算符
着重学到的是++自加运算符与(类型)类型转换运算符
在自加运算符中,例如++i,先做自加,在进行赋值,i++则相反,先进行赋值,在进行自加,
同时在这之中我们了解到了什么是左值什么是右值。
在c语言中,常量一般是右值,左值一般是变量。在这我们了解到const这个用法,在定义变量前加入,让这个变量成为只读变量,所以这个变量只能读,不能改,这个时候则是右值。
在优先级3~12则为双目运算符
在这之中首先学习了基础+ - * /的用法。
各类型数据的混和运算
在今天学习的重点是各种类型数据的混合运算,
例如:用一个int型加一个float型,会得到什么。
这是一张混合运算的隐式转换。
在低优先级碰到高优先级的类型时,系统会自己将低优先级的转化为高优先级的类型在得出答案
在这之中我们也了解到什么叫临时变量(匿名变量)例如打印一个i++,我们知道要首先进行赋值,在进行自加,那么在一个式子的运行过程中,不会出现这条式子赋值完了在退回去进行自加,这时,就会有临时变量的出现,先将i的值拷贝到这个临时变量中进行输出,i则进行自加。这就是临时变量。
有隐式转换就有显示转换
(类型)类型转换运算符,例如:
double a = 10;
int b = 5;
printf("%d\n",(int)a + b)
在这个式子中就将a转化为int型了。
但是在这个过程中会出现数据丢失,例如将浮点数转换为整型,那么将不会出现小数。这时就出现了数据丢失。
混合赋值
在我们进行代码的编写时,我们经常会遇到一些问题,比如将一个整型的变量赋值给了一个浮点数的变量,这或许不会出现问题,若是将一个float的变量赋值给一个int型的变量呢,这就会出现一个现象就是小数部分截断。
在进行赋值时,浮点数的格式时符号位加阶码加尾数,但是整型只有符号位,数值,所以c就直接将浮点数的整数部分拉出来赋值到int类型的变量里
同样有个问题,如果将一个int的变量的值赋给一个short的变量里,会出现高位截断,例如在内存中存储的int型数据aaaabbbb,将他赋值到short中则会只剩下bbbb。这就是高位截断。反过来就是将short的值赋给int的地位
同时也会出现一个问题。将一个值为-1的short型向一个整型扩展,则,整数部分就老老实实拷贝,高位部分的值则取决于他的符号位,如果时负数,则都为1,如果为正则都为0.若是无符号数,同样都是0.