2.7 赋值运算符与赋值表达式
在C语言程序中可以将符号“=”作为一个运算符处理,称为赋值运算符,用于构造赋值表达式。
1.赋值运算符
赋值表达式的一般形式为:
变量=表达式
赋值运算符的功能就是将“=”右边表达式的值赋给左边的变量。例如,“a=3”是一个赋值表达式,其作用是执行一次赋值操作(或称赋值运算),把常量3赋给变量a。赋值表达式的运算结果是“=”右边的表达式的计算结果,因此,“a=3”的结果为3。
关于赋值运算符的使用,需要注意:
① 在一个表达式中可以连续使用多个赋值运算符,运算时按自右向左的顺序进行,即赋值运算符具有右结合性。例如,“a=b=c=0”相当于“a=(b=(c=0))”,即最后的结果为a、b、c都是0。
② 赋值运算符的优先级较低(仅高于逗号运算符)。例如,语句“i=j=m*n;”的执行顺序是:首先计算出算术表达式m*n的值,然后处理赋值表达式“j=m*n”,将m*n的值赋给j,最后处理赋值表达式“i=j=m*n”,将j=m*n的值赋给i。
③ 当赋值运算符两边的数据类型不一致时,系统自动将结果转换成赋值运算符左边变量的类型后再赋值,具体如下。
● 整型数据赋给实型变量时,数值不变,但以浮点数形式存储到变量中。例如,假设f为单精度实型变量,则执行“f=123”后的结果是使f的值变为123.000000。
● 实型数据赋给整型变量时,会自动舍弃实数的小数部分。例如,假设i为整型变量,则执行“i=234.856”后的结果是使i的值变为234。
● 将较短(位数较少)的整型数赋给较长的整形变量时,保持数值大小不变直接赋值,例如,对于短整型s=123,若l为长整型变量,则“l=s”的结果还是123。
● 将较长(位数较多)的整型数赋给较短的整型变量时,会“截断”这些较长的整型数,只保留低位的数字。例如,如果c为字符型变量,“c=300”的结果为44。“截断”是在内存中的二进制位上进行的,可以理解为求余数运算,因此“c=300”等价于“c=300%256”(256是8个二进制位所能表达的整数的个数)。
● 将有符号整型数赋值给无符号整型变量或者将无符号整型数赋值给有符号整型变量时,要考虑符号的变化(维持补码不变)。例如,整型变量的位数为32,如果i为有符号整型变量,u为无符号整型变量,则“i=-1”结果为-1,“u=-1”结果为4294967295(232-1),而“i=4294967295”结果为-1。
考虑到赋值表达式的复杂性,通常,程序中应显式地使用类型转换,以避免自动类型转换带来的不确定性。
2.复合赋值运算符
在赋值运算符“=”之前加上+、-、*、/、%、<<、>>、%、|、^ 10种双目运算符,可以构成复合的赋值运算符,其优先级和结合性都与赋值运算符“=”一样。例如:
a+=10等价于a=a+10
a-=b等价于a=a-b
a*=b等价于a=a*b
x%=y*8等价于x=x%(y*8)
x/=y+4等价于x=x/(y+4)
a%=b+2等价于a=a%(b+2)