![C++新经典](https://wfqqreader-1252317822.image.myqcloud.com/cover/184/44510184/b_44510184.jpg)
2.3 赋值运算符和逗号运算符
2.3.1 赋值运算符和赋值表达式
1.赋值运算符
赋值运算符已经不陌生,前面已经用过多次,赋值运算符是一个“=”号。它的含义是:“将等号右边的值赋给等号左边的变量”。注意,等号左边必须是一个变量。
所谓赋值,可以理解成:给变量一个值或者改变变量到某一个值。换句话说,执行完一条赋值语句后,变量的值就被设置为新给的值了。看看如下范例:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p58_85269.jpg?sign=1738948308-FUvDmZL2RgAaLcFTq294BexFt9s3Gcfy-0-cd657ac6b9edac9675f591f598701246)
将整型数据赋值给实型变量(单精度变量和双精度变量)时,数值不变,但是会以浮点数形式(指数形式)存储在内存中(指数形式形如2.4E10)。
这里要注意一下几个概念,看看下面这行代码:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p58_85270.jpg?sign=1738948308-DotNfrKYoIOQo5LkmbXiikbdWCugAO35-0-d1c7f307e0c3c3abeb409e48e0e42237)
而下面这行代码不是赋值语句,称为定义时初始化(定义时给初值)语句更为合适,因为这行代码最前面有一个类型标识符char(赋值语句是不可以以类型名作为语句开头的):
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p58_85271.jpg?sign=1738948308-rVE8JNZ0yO8KQ2D7yHy5pGAPiSDceckT-0-e84c673bcea9c7aad02214167a1b8109)
而下面这行代码是赋值语句(假设a变量在之前已经声明过),但是这个赋值语句的执行会导致变量a中所保存的结果值溢出,因为char类型的变量保存的数据值范围在-128~127之间:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p58_85272.jpg?sign=1738948308-UEUpyXEdzJ83KgLLnpurUmickPALutkd-0-63f0c60688503f39d2950186295bc614)
赋值的原则:赋值符号左侧和右侧的数据类型应该相同,类型不同时可以用强制类型转换运算符,当用强制类型转换运算符时,开发者必须自己明确知道不会造成赋值后的数据溢出。如果不遵照这样的原则,可能赋值结果就是难以预料的结果。继续看如下范例:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p58_85274.jpg?sign=1738948308-XOfi9IJsUxojqrFDS4FkKxl7RBafUl2e-0-98a2d5c2afe52b024af35492fcb20d60)
2.复合的赋值运算符
在赋值运算符“=”之前增加其他运算符,构成复合赋值运算符。看看下面这些代码:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p58_85275.jpg?sign=1738948308-7XzsWnVrDgVaDxpS5hqW6ZUhEHEOuNef-0-8005b4e3478429259ff8a28ee6205d25)
看看如下范例:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p59_85276.jpg?sign=1738948308-r22aQmtTpt73r8PbxHiUn4d2suszGZSJ-0-470f069f2847b239c0f8a85b2898d328)
执行后,a的最终结果为14。
此外,还有很多其他的复合赋值运算符,遇到时再细说,但运算的思路是相通的。所谓思路,就是a+=b等价于a=a+b的思路。以a+=b为例来说明:
(1)把最左边的变量单独写下来:a。
(2)把整个式子中的“=”去掉,变成:a+b。
(3)通过赋值运算符“=”把上述两部分内容连起来,构成a=a+b。
3.赋值表达式的值
赋值表达式本身是有值的,赋值表达式的值就是赋值运算符(=)右侧的值。看看下面这两行代码的结果:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p59_852771.jpg?sign=1738948308-YP3oJGta6JArgR0cRS7Fdkxy75jhm47v-0-9c722e31e13fe0564fc91fb8c625ebb4)
再看看下面几行代码:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p59_85277.jpg?sign=1738948308-UaheniFncYngSsmGLfbnLcTke6hwZCOf-0-1da0c302933a6546d5401d3d9cb3a056)
一般来说,运算符的结合顺序(运算顺序)是从左到右,如3+4+7,但赋值运算符的结合顺序是从右到左。看看下面这行代码:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p59_85278.jpg?sign=1738948308-Rkl9Mm1wtdxRCGAAGLLMLfnBjfzlgY5O-0-92ddd7e29bb968ba710d84280ac8a6dd)
运算顺序问题不用多虑,记不清运算符优先级的时候直接用圆括号括住要优先运算的部分。看看下面这行混合了普通赋值运算符和复合赋值运算符的代码:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p59_85279.jpg?sign=1738948308-n4GBKEBBejH8rx2tvnoVE8TJGKMgW1ta-0-585dc5f0960d0b1d5403000048243917)
这行代码立即看出来如何计算比较难,这其实也是考验读者对运算符优先级的认识。建议的做法是用圆括号明确地标识出计算顺序,如下所示:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p59_852801.jpg?sign=1738948308-9ttBz02n0RSh6sQwJKwBpU8mRfVYi4ay-0-512f7f23351ea4612ca412ca35a7f78d)
看看如下范例:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p59_85280.jpg?sign=1738948308-k6omDlRHI7OfRui5P97s3gmoGfwD4UxR-0-7ca71fe83f6da9c0d05b044ad29fc8b5)
看看下面这些代码,可以在计算机上进行演示学习,但是,在实际工作中,尽量不要这样写代码,实在是让人难以读懂!
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p60_85282.jpg?sign=1738948308-eNSsXDJiVn9uySvmQdt1bYIHU60ABwcR-0-e95fdca24168f63ba8e9694b3118a4e1)