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

赋值运算符和赋值表达式是 C语言的一种基本的运算符和表达式。赋值表达式的作用就是设置变量的值,实际上是将特定的值写到变量所对应的内存单元中去。

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

C语言中的赋值运算符是“=”,它的功能是把其右侧表达式的值赋给左侧的变量。由“=”连接的式子称为赋值表达式。其一般形式为:

变量=表达式

例如

intx,y;  /*首先定义整型变量x和y*/

x=2;   /*把常量2赋给变量x*/

y=x+2;  /*计算x+2的值,并赋给变量y,变量x本身的值不变*/

说明

(1)赋值运算符具有右结合性

【例如】

   a=b=c=5;

   /*对3个变量a,b,c进行赋值*/

由于赋值运算符的右结合性,此赋值表达式等价于:

   a=(b=(c=5));

(2)凡是表达式可以出现的地方均可出现赋值表达式

【例如】

x=(y=1)+(z=2);

让我们一起来分析一下这个表达式。

①把1赋给变量y,不要忘记圆括号的优先级是最高的;

②把2赋给变量z;

③求y+z的值,即1+2的值等于3;

④将③求得的值赋给x,所以x的值应该是3。

(3)赋值运算符“=”左边必须是变量名

【例如】

inta,b;

(a+b)=1;

(a-3)=5;

这类表达式就是不合法的,也就是说,不能对表达式赋值(除了表示指针的表达式)。

如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,转换的规则是:把赋值运算符右边表达式的类型转换为左边变量的类型。具体规定如下所述。

(1)浮点型赋予整型

赋值原则是舍弃浮点数的小数部分,只保留整数部分。

(2)整型赋予实型

赋值原则是数值不变,但将以浮点形式表示,即增加小数部分,小数部分用0表示。

(3)字符型赋予整型

赋值原则是将字符所对应的ASCII码值赋予整型数据。

(4)整型赋予字符型

赋值原则是把整型数据赋予字符型数据,赋值后的字符型数据的值就是该整数ASCII码值所对应的字符。

(5)单、双精度浮点型之间的赋值

C语言中的浮点值总是用双精度表示的,如果将float类型的变量赋予double类型的变量,只是在float型数据尾部加0延长为double型数据参加运算,然后直接赋值。如果将double型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。

2.8.2 复合的赋值表达式

所谓复合的赋值表达式就是在赋值运算符之前加上其他的运算符而构成的表达式。复合赋值表达式的一般形式是:

变量operater=表达式

它等价于:

变量=变量operater(表达式 )

说明

●operater代表赋值或其他运算符。

●operater与“=”构成复合的赋值运算符。与算术运算符有关的常用的复合运算符有“+=”“-=”“*=”“/=”和“%=”。

例如

a+=2

该表达式等价于“a=a+2”,其含义是把a的值加上2,然后再赋给a。与“+=”类似,“a-=2”等价于“a=a-2”,其含义是把a的值减去 2,然后再赋给 a。依次类推,“a*=2”等价于“a=a*2”,其含义是把 a的值乘以2,然后再赋给a;“a/=2”等价于“a=a/2”,其含义是把a的值除以2,然后再赋给a;“a%=2”等价于“a=a%2”,其含义是把a的值模2,然后再赋给a。

复合的赋值运算符的优先级与赋值运算符的优先级是相同的,它们的优先级要比算术运算符的优先级低,并且复合的赋值运算符与赋值运算符具有相同的结合性,即自右向左。

【例2-7】分析下列程序的结果。

程序代码

#include<stdio.h>

void main( )

{ int a=1;

 a+=a-=a+a;

 printf("%d\n",a);

程序的运行结果是:

   -2

分析一下程序的执行过程。

① 因为复合赋值运算符的结合性是自右向左的,所以先计算a+a的值,即为2。

②计算a-=①的值,即a=a-2,为-1。需要特别注意的是,经过①的运算a的值并没有改变,仍是初值1。这时a的值就变成了-1。

③计算a+=②的值,即a=a+(-1),注意在②的运算中a的值是-1。所以,此时a的值是(-2)。

所以最终屏幕上显示的a的值是-2。

真题演练

【例1】设a,b,c是整型变量且均已赋值,则以下选项中错误的赋值语句是( )。

A)a=(b=3)=1;

B)a=(b=2)+c;

C)a=b=c+10;

D)a=1+(b=c=2);

【解析】赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量,且左右两边数据类型相同才能实现赋值。选项A中,赋值运算(b=3)=1,左值为表达式,不是变量不能被赋值,所以选项A错误。选项B运算过程为:先赋值b=2,再计算b+c,将结果赋给a,是正确的赋值语句。选项C运算过程为:先计算c+10,再将结果赋给b,然后将b赋给a,是正确的赋值语句。选项D运算过程为:先将2赋给c,再将c赋给b,然后计算1+b,最后将结果赋给a,也是正确的赋值语句。

【答案】A

【例2】设有定义:inta=0,b=1,c=1;,以下选项中,表达式值与其他3个不同的是( )。

A)b=a==c

B)a=b=c

C)a=c==b

D)c=a!=c

【解析】赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量,且左右两边数据类型相同才能实现赋值。成功实现赋值后以左值为返回值。逻辑表达式成立则返回1,不成立则返回0。选项A中,逻辑表达式a==c不成立(0),则b=0,表达式值为0。选项B中,将c赋值给b,b=1,再将b赋给a,a=1,表达式值为1。选项C中,逻辑表达式c==b成立(1),则a=1,表达式值为1。选项D中,逻辑表达式a!=c成立(1),则c=1,表达式值为1。选项A与其他选项不同,所以选择选项A。

【答案】A

【例3】若想给已定义为 int型的变量 a,b,c,d赋值为1,以下选项中错误的语句是( )。

A)d=1,c=d,b=c,a=b;

B)a=b=c=d=1;

C)a=1,b=a,c=b,d=c;

D)a=b,b=c,c=d,d=1;

【解析】赋值是将一个常量的值赋给一个变量。在选项D中,变量b的值相当于一个未知的数,用b对a赋值,不满足题干要求的变量a、b、c、d赋值为1的条件,因此选择选项D。

【答案】D