1
C语言程序设计
1.3.4.2 2.4.2 赋值运算符和赋值表达式

2.4.2 赋值运算符和赋值表达式

在程序设计中,赋值运算符应该说是最重要的运算符了。因此,赋值的概念也尤其重要。所谓赋值是将一个数据值存储到一个变量中。需要注意的是,赋值的对象只能是变量,而这个数据值既可以是常量,也可以是变量,还可以是有确定值的表达式。

1.赋值运算符

赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“i=56”的作用是执行一次赋值操作(或称赋值运算),把常量56赋给变量i。

2.赋值表达式

由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为:

  变量=表达式

执行赋值表达式时,将赋值运算符右侧的“表达式”的值赋给赋值运算符左侧的变量。赋值表达式的值就是被赋值的变量的值。

在使用赋值表达式时应注意以下几点:

(1)在赋值运算符左边的量必须是变量,不能是常量或用上述运算符结合起来的表达式。例如:

  int i,j;

  i=38;

  j=i;

是正确的赋值形式;而

  38=i;

  j+i=90;

等形式则是不正确的。因为按赋值操作含义,是把赋值运算符右边的值送到赋值运算符左边所表示的对象中去,这些对象的地址必须受到C编译的控制和管理。而像38这样的常量和j+i这类的表达式都不具有内存的地址。

(2)赋值运算可连续进行。也就是说,上述一般形式的赋值表达式中的“表达式”,可以是一个赋值表达式。如:

  i=j=k=120

其中有三个赋值运算符。按照赋值运算符的结合性——自右至左结合,这个表达式就等同于i=(j=(k=120))。

其赋值过程是自右至左进行的:先将120赋给k,再把k的值赋给j,最后把j的值赋给i,相当于“k=120”、“j=k”和“i=j”三个赋值表达式。最终的结果是i、j和k三个变量的值都为120,整个赋值表达式的值也等于120。

(3)赋值运算符的优先级比算术运算符的优先级都低。如果在表达式中需要某些赋值操作先做,必须把那部分用圆括号括起来。例如:

  i=(j=12)*(k=8)

最终i、j、k的值分别为96、12和8。

(4)赋值表达式的值等于赋值运算符右边表达式的值,而结果的类型由赋值运算符左边变量的类型决定。如果赋值运算符右边值的类型与左边变量的类型不一致,需要把右边值的类型转换成左边变量的类型,例如:

  int i=85,j=7,result;

  float x=2.6;

  result=i/x+j;

在这个赋值语句中,赋值运算符右边表达式值的类型是float型(因为运算前浮点量和其他类型量都转换为float型),而变量result的类型为int型,所以赋值语句执行后结果的类型应为int型,即取float型的值的整数部分,其结果为39。

(5)除了上述基本的赋值运算符外,C语言还提供了另外10个赋值运算符,它们是:

  += −= *= /= %= 〉〉= =〈〈 &=  |=  ^=

这些运算符把“运算”和“赋值”两个动作结合在一起作为一个复合运算符来使用,往往把它们称为复合赋值运算符。后5种是有关位运算的,将在后面的章节中介绍。例如:

  a+=56    等价于 a=a+56

  x*=y+23   等价于 x=x*(y+23)

以“a+=56”为例来说明,它相当于使a进行一次加(56)的操作。即先使a加56,再赋给a。同样,“x*=y+23”的作用是使x乘以(y+23),再赋给x。因为加操作的优先级高于赋值操作的优先级。

例如,下面的这个赋值表达式:

  b+=b−=b*b

如果b的初值为5,此赋值表达式的求解步骤如下:①先进行“b−=b*b”的运算,它相当于b=b−b*b,b的值为5−25=−20。②再进行“b+=−20”的运算,相当于b=b+(−20),b的值为−20−20=−40。

将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且能以表达式形式出现在其他语句(如输出语句、循环语句等)中,例如:

  printf("%d",i=j);

如果j的值为78,则输出i的值(也是表达式i=j的值)为78。在一个语句中完成了赋值和输出双重功能。

C采用这种复合运算符,一是为了简化程序,使程序精炼,二是为了提高编译效率。复合赋值运算符的优先级与基本赋值运算符的优先级相同,除了逗号运算符外,赋值运算符的优先级是最低的。各种运算符的优先级将在2.6节中介绍。