一、赋值表达式
1、定义:由赋值运算符或复合赋值运算符将一个变量和一个表达式连接起来的表达式,称为赋值表达式。
2、赋值表达式的构成规则:
变量=表达式
变量 复合赋值运算符 表达式
其中,表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式等。由于逗号运算符的优先级低于赋值运算符,所以应注意加圆括号。
例: a=b=c=5 //表达式值为5,a,b,c值为5
a=(b=5) // b=5;a=5
a=5+(c=6) //表达式值11,c=6,a=11
a=(b=4)+(c=6) //表达式值10,a=10,b=4,c=6
a=(b=10)/(c=2) //表达式值5,a=5,b=10,c=2
二、自动类型转换
1、自动类型转换:
参与运算的各个数据都转换成数据较长的数据类型,然后计算,结果的类型就是数据长度较长的数据类型。本质上是较低类型的转换,即“ 就高不就低”或“就长不就短”的原则。
❖什么情况下发生
⚫ 运算转换------不同类型数据混合运算时
⚫ 赋值转换------把一个值赋给与其类型不同的变量时
⚫ 输出转换------输出时转换成指定的输出格式
⚫ 函数调用转换------实参与形参类型不一致时转换
❖运算转换规则:不同类型数据运算时先 自动转换成同一类型
先将运算结果的数据类型自动转换为左边变量的数据类型,然后再赋予该变量。本质上是“就左不就右”的转换原则。
例:设int a=1; float b=2.1; char c=’a’;
则表达式a=b+c的计算过程是先计算b+c,按照“ 就高不就低”的规则,将c转换为实型(变量c的值是97,转化为97.0),计算结果是实型,即99.1,由于变量a是整型,按照“ 就左不就右”的规则,所以将实型自动转换为整型赋予变量a,即99赋值给变量a。
除了自动类型转换和赋值类型转换外,C语言也允许强制类型转换。
数据类型强制转换的一般格式:(数据类型符)(表达式)
C语言首先按照自动类型转换原则计算表达式的值,然后将其转换为指定的数据类型。需要注意的是,若表达式仅仅是单个常量或变量时,外面的一对圆括号可以省略;若是含有运算符的表达式,则必须用一对圆括号括起来。
int a; float b=1.9; 执行语句 a=(int)b后变量a和b的值分别是 1,1.9
❖强制类型转换
❖一般形式: (类型名)(表达式) 强制类型转换运算符
例:
(int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
❖说明:强制转换得到所需类型的中间变量,原变量类型不变
❖精度损失问题
较高类型向较低类型转换时可能发生
2、数据类型转换图

3、进行数据类型转换时,需要注意以下几点:
1、强制类型转换获得的是一个所需类型的中间量,原来表达式的类型并不发生变化。
2、表达式计算过程中,参与运算的常量或变量的类型自动转换是临时的,它仅产生一个临时的、类型不同的数据参与运算,常量或变量的原类型和值均不改变。
3、运算结果赋予变量的类型转换过程中,无论是自动变量的还是强制的,当数据长度较长的结果存入数据长度较短的变量时,将截去超出的部分,有可能造成错误。
4、数据类型转换将占用系统时间,过多的转换将降低程序的运行效率,所以除了必要的数据类型转换外,应尽量选择好数据类型,避免不必要的转换。
【例】1、设int x=2, y=4;值为非0的表达式是( C )
A. 1/x*y B. 1/(x*y) C. 1.0/x/y D. 1/x/ (double)y
答案:C
解析:1/x*y中1、x和y都是整型,即在1整除x时,值为0,即1/x*y最终的值为0;1/(x*y)中1是整型常量,即在1整除x*y时,值为0;1.0/x/y中1.0表示1.0为实型,即在1.0整除x时,是可以保留小数的,即1.0/x/y最终的值为非0;1/x/ (double)y中1和x都是整型,即在1整除x时,值为0。
【例】2、设int a=1;float b=2.1;char c=‘a’;,则表达式a=b+c最后的类型为(A )
A. int B. float C. double D. char
答案:A
解析:表达式a=b+c的计算过程是先计算b+c,按照“就高不就低”的规则,将c转换为实型,c的值为97.0,计算结果为实型,即99.1,由于变量a是整型,按照“就左不就右”的规则,则表达式a=b+c最后的类型为int型。
【例】3、设char c1; , 则c1中为小写英文字母字符的正确表达式为( (c1>='a’)&&(c1<='z’) )
解析:逻辑符号“&&”是要同时满足左右两个表达式才为真,“||”是满足左右两个表达式中的一个就可以,小写字母的范围是从a到z,并且小写字母是字符,要用单引号括起来,即c1中为小写英文字母字符的正确表达式为(c1>='a’)&&(c1<='z’)