今天学习了C语言算数运算符和算术表达式,赋值运算符和赋值表达式以及各类数值型数据间的混合运算
1.基本的算术运算符
加法运算符+,如2+8、+4;
减法运算符-,如5-4、-6;
乘法运算符*,如4*8;
除法运算符/,如3/8;
求余运算符%,%两侧均应为整型或与整型相兼容的类型,如9%4的值为1。
2.算数表达式和运算符的优先级和结合性
根据算术运算符的优先级的不同进行运算。
3.强制类型转换运算符(显式转换)
可以利用强制类型转换运算符将一个表达式转换成所需类型,但有可能造成信息丢失。
例如:(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成整型)
(float)(8%5) (将8%5的值转换成float型)
其一般形式为:(类型名)(表达式)
注意,表达式应该用括号括起来。如果写成(int)x+y,则只将x转换成整型,然后与y相加。
4.自增自减运算符
++i,--i,其作用是使 i 在使用前加1或减1;
i++,i--,其作用是使 i 在使用后加1或减1。
自增和自减运算符只能用于变量,不能用于常量和表达式。
5.左值和右值
左值left value,一般简写为Lvalue,表示运算符左边的变量;
右值right value,一般简写为Rvalue,表示运算符右边的常量。
判断方法:在内存中能定位的是左值,能取地址的是左值,临时变量(匿名变量)是右值,
强制类型转换运算符转换的变量将变成只读变量,是临时变量,如:const int i = 2,此时 i 变成只读变量,不可修改。
6.各类数值型数据间的混合运算
在运算中,不同的数字型数据会有不同的转换(隐式转换)。
上图中横向向左的箭头表示必定的转换,如字符数据必定先转换为整数,short型转换为int型,float型数据在运算时一律先转换成双精度型,以提高运算精度(即使是两个float型数据相加,也先都化成double型,然后再相加)。
纵向的箭头表示当运算对象为不同类型时转换的方向。例如int型与double型数据进行运算,先将int型的数据转换成double型,然后在两个同类型(double型)数据间进行运算,结果为double型。
7.赋值运算符和赋值表达式
赋值运算符就是“=”,是自右向左的赋值,如:i = j,实际上是把 j 的值赋给 i 。
不同数据类型间的混合赋值,本质为内存拷贝。
double = int,可以进行赋值,如:int = 123,则赋值给double之后为123.000000;
int = double,可以进行赋值,但小数部分会截断,如:double = 123.456,则赋值给int之后为123;
short = int,由于short只有2个字节,int有4个字节,因此int赋值给short时不能全部都给short,只能将int的低位字节赋值给short,因此,int赋值给short时会高位截断;
int = short,由于int有4个字节,short只有2个字节,所以当short赋值给int时,赋给int的低位字节且int仍有2个字节的空位,此时int的两个空字节将根据short的符号来进行不同的变化,如果short为正,则空字节为00 00,如果short为负,则空字节为FF FF,这种方式称为符号位扩展;
unsigned int = int,有符号赋值无符号,则系统会判断高位首字节是否为1或0,为1则为负,将按位取反再加1,获得补码,再给unsigned int赋值,此时unsigned int无符号;
int = unsigned int,无符号赋值有符号,则系统会认为高位首字节为数值而不是符号判断,则int将获得相应的赋值,有符号;
总结:短数据类型向长数据类型赋值为扩展,根据符号来扩展,如果有符号,则空位字节补1,如果没有,则空位字节补0。
8.逗号运算符和逗号表达式
逗号运算符的作用是将两个表达式连接起来,如:1+2,5+8;
逗号表达式称顺序求值表达式,如:a+b,c+d;是从左到右的顺序依次运算