
2.3 赋值运算符和逗号运算符
2.3.1 赋值运算符和赋值表达式
1.赋值运算符
赋值运算符已经不陌生,前面已经用过多次,赋值运算符是一个“=”号。它的含义是:“将等号右边的值赋给等号左边的变量”。注意,等号左边必须是一个变量。
所谓赋值,可以理解成:给变量一个值或者改变变量到某一个值。换句话说,执行完一条赋值语句后,变量的值就被设置为新给的值了。看看如下范例:

将整型数据赋值给实型变量(单精度变量和双精度变量)时,数值不变,但是会以浮点数形式(指数形式)存储在内存中(指数形式形如2.4E10)。
这里要注意一下几个概念,看看下面这行代码:

而下面这行代码不是赋值语句,称为定义时初始化(定义时给初值)语句更为合适,因为这行代码最前面有一个类型标识符char(赋值语句是不可以以类型名作为语句开头的):

而下面这行代码是赋值语句(假设a变量在之前已经声明过),但是这个赋值语句的执行会导致变量a中所保存的结果值溢出,因为char类型的变量保存的数据值范围在-128~127之间:

赋值的原则:赋值符号左侧和右侧的数据类型应该相同,类型不同时可以用强制类型转换运算符,当用强制类型转换运算符时,开发者必须自己明确知道不会造成赋值后的数据溢出。如果不遵照这样的原则,可能赋值结果就是难以预料的结果。继续看如下范例:

2.复合的赋值运算符
在赋值运算符“=”之前增加其他运算符,构成复合赋值运算符。看看下面这些代码:

看看如下范例:

执行后,a的最终结果为14。
此外,还有很多其他的复合赋值运算符,遇到时再细说,但运算的思路是相通的。所谓思路,就是a+=b等价于a=a+b的思路。以a+=b为例来说明:
(1)把最左边的变量单独写下来:a。
(2)把整个式子中的“=”去掉,变成:a+b。
(3)通过赋值运算符“=”把上述两部分内容连起来,构成a=a+b。
3.赋值表达式的值
赋值表达式本身是有值的,赋值表达式的值就是赋值运算符(=)右侧的值。看看下面这两行代码的结果:

再看看下面几行代码:

一般来说,运算符的结合顺序(运算顺序)是从左到右,如3+4+7,但赋值运算符的结合顺序是从右到左。看看下面这行代码:

运算顺序问题不用多虑,记不清运算符优先级的时候直接用圆括号括住要优先运算的部分。看看下面这行混合了普通赋值运算符和复合赋值运算符的代码:

这行代码立即看出来如何计算比较难,这其实也是考验读者对运算符优先级的认识。建议的做法是用圆括号明确地标识出计算顺序,如下所示:

看看如下范例:

看看下面这些代码,可以在计算机上进行演示学习,但是,在实际工作中,尽量不要这样写代码,实在是让人难以读懂!
