c语句分为控制语句,函数调用语句,空语句,复合语句,表达式语句。
赋值语句属于表达式语句。
以下为赋值语句的相关介绍。
1.赋值运算符
1.介绍
赋值符号“=”即为赋值运算符,它的作用是将一个数据赋给一个变量。如a=3的作用是执行一次赋值操作,把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。
2.复合的赋值运算符
在赋值符=之前加上其他运算符,可以构成复合的运算符。
例如:
a+=3 等价于 a=a+3
x*=y+8 等价于 x=x*(y+8)
x%=3 等价于 x=x%3
凡二元(二目)运算符(二元运算符是指需要两个操作数才能进行操作的运算符),都可以与赋值符一起组合为赋值运算符。如+=,-=,*=,%=,/=。
2.赋值表达式
赋值语句实在赋值表达式的末尾加一个分号构成,而赋值表达式是将一个变量和一个表达式连接起来的式子。基本形式为变量+赋值运算符+表达式。它的作用是将一个表达式的值赋给一个变量,所以其具有计算和赋值的双重功能。
赋值运算符左侧应该是一个可修改的“左值(left value,简称lvalue)”。左值的意思是它可以出现在赋值运算符的左侧,它的值是可以改变的。左值应当为存储空间并可以被赋值。变量可以作左值,算术表达式a+b就不可以作左值,常量因为不能被赋值所以也不能作左值。在赋值运算符右侧的表达式称为“右值(right value,简称rvalue)”,凡是左值都可以作为右值。如:
b=a; //b为左值
c=b; //b为右值
赋值表达式中的“表达式”又可以是一个赋值表达式。例如:
a=(b=5);
括号内的b=5是一个赋值表达式,值为5。而整个表达式即可拆分为a=b和b=5两个赋值表达式,因此a=5。因为赋值运算符按照“自右而左”的结合顺序,因此a=(b=5)与a=b=5等价。以下为几个例子:
a=b=c=5 (表达式的值为5,a=5,b=5,c=5)
a=5+(c=6) (表达式的值为11,a=11,c=6)
a=(b=4)+(c=6) (表达式的值为10,a=10,b=4,c=6)
a=(b=10)/(c=2) (表达式的值为5,a=5,b=10,c=2)
把赋值表达式作为表达式的一种,使得赋值操作不仅可以出现在赋值语句中,而且可以以表达式的形式出现在其他语句中(如输出语句、循环语句等)。如:
printf("%d",a=b); //如果b=3,那么a=3
3.*赋值过程中的类型转换
如果赋值运算符两侧的类型一致,则直接进行赋值。如:
i=234; //设i为整型变量
此时直接存储整数234进入i的存储单元中。
如果赋值运算符两侧的类型不一致,但都是基本类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的,转换的规则是:
(1)将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋予整型变量。如果 i 为整型变量,执行" i =3.56;"的结果是使 i 的值为3,以整数形式存储在整型变量中。
(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。如果有 float 变量 f ,执行" f=23;"。先将整数23转换成实数23.0,再按指数形式存储在变量f中。如将23赋给 double 型变量 d ,即执行" d=23;",则将整数23转换成双精度实数23.0,然后以双精度浮点数形式存储到变量 d 中。
(3)将一个 double 型数据赋给 float 变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到 float 型变量的4个字节中。应注意双精度数值的大小不能超出 float 型变量的数值范围。例如,将一个 double 型变量 d 中的双精度实数赋给一个 float 型变量f。
double d=123.456789e100; //指数为100,超过了float数据的最大范围
f无法容纳如此大的数,出现错误。
将一个 float 型数据赋给 double 型变量时,数值不变,在内存中以8个字节存储,有效位数扩展到15位。
(4)字符型数据赋给整型变量时,将字符的ASCLL代码赋给整型变量。如:
i='A'; //已定义i为整型变量
因为'A'字符的ASCLL代码为65,因此赋值后i的值为65。
(5)将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量(例如把占4个字节的 int 型数据赋给占2个字节的 short 变量或占1个字节的 char 变量)时,只将其低字节原封不动地送到被赋值的变量(即发生"截断")。例如:
int i=289;
char c='a';
c=i;
解释如下: i=289; 0000000100100001
c=33; 00100001
所以c的值为33。如果用"%c"输出c,得到字符"!"(其ASCLL值为33)。