2.5.3 赋值运算符和赋值表达式
1. 简单赋值运算符和简单赋值表达式
简单赋值运算符记为=。由=组建的式子称为赋值表达式。
(1) 简单赋值表达式格式
- 变量=表达式
赋值表达式的作用就是将赋值号右边表达式的值赋给赋值号左边的对象。赋值表达式的类型为赋值号左边对象的类型,其结果值为赋值号左边对象被赋值后的值。如下所示:
- a=5 //表达式值为5
(2) 简单赋值表达式使用说明
① 赋值运算符的功能具有单向性,即只能将表达式的值传送变量,反之则不然。
② 赋值运算符左边只能是单个变量名,不能是其他运算量。
③ 赋值运算符右边可以是常量、变量、函数或表达式。
④ 赋值运算符兼有计算与赋值双重功能,它首先计算出赋值运算符右边表达式的值,然后把此值再赋给左侧的变量。
⑤ 赋值运算符具有右结合性。因此a=b=c=5可理解为a=(b=(c=5)),即表达式值为5,a,b,c均为5。这个表达式从右向左运算,在c被更新为5后,表达式c=5的值为5,接着b的值被更新为5,最后a被赋值为5。
⑥ 凡是表达式可以出现的地方均可出现赋值表达式。例如,式子x=(a=5)+(b=8)是合法的。其意义是把5赋给a,8赋给b,再把a与b相加,和赋给x,故x应等于13。
⑦ 赋值运算符的优先级低于算术运算符。
⑧ 按照C++语言规定,任何表达式在其末尾加上分号就构成语句,所以在赋值表达式末尾加分号就构成了赋值语句,在程序中大量使用。
2. 赋值运算中的自动类型转换
如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值运算符右边的类型转换成左边的类型。具体规定如下。
(1) 实型赋给整型,舍去小数部分。
(2) 整型赋给实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。
(3) 字符型赋给整型,由于字符型为一个字节,故将字符的ASCII码值放到整型量的低八位中,高位为0。整型赋给字符型,只把低八位赋给字符量。
(4) 在赋值运算中,赋值运算符两边量的数据类型不同时,赋值运算符右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
例2-7 赋值运算中的自动类型转换。
- #include<iostream.h>
- void main()
- {
- float pi=3.14159;
- int s,r=10;
- s=r*r*pi;
- cout<<"s="<<s<<endl;
- }
程序运行结果如图2-8所示。本例程序中,pi为实型;s、r为整型。在执行s=r*r*pi语句时,r和pi都转换成double型计算,结果也为double型。但由于s为整型,故赋值结果仍为整型,舍去了小数部分。

3. 复合的赋值运算符
Visual C++除了使用=赋值运算符外,还支持其他类型的赋值运算符。如表2-10所示列出了Visual C++的5种算术赋值运算符,其用途使程序更加精炼。
表2-10 算术赋值运算符
|
符 号
|
用 法
|
含 义
|
|
+=
|
a+=b
|
先计算a+b,然后把结果赋给a
|
|
-=
|
a-=b
|
先计算a-b,然后把结果赋给a
|
|
*=
|
a*=b
|
先计算a*b,然后把结果赋给a
|
|
/=
|
a/=b
|
先计算a/b,然后把结果赋给a
|
|
%=
|
a%=b
|
先计算a%b,然后把结果赋给a
|
构成复合赋值表达式的一般形式为:
- 变量 双目运算符=表达式
其等效于:
- 变量=变量 运算符 表达式
如下所示:
- a+=5 //等价于 aa=a+5;
- x*=y+7 //等价于 xx=x*(y+7);
复合赋值运算符这种写法,对初学者可能不习惯,但十分有利于编译处理,能提高编译效率。