使用赋值运算符=可以把计算的结果存储到变量中。下面看一个例子。假定用下面的语句声明3个变量:
int total_fruit = 0;
int apples = 10;
int oranges = 6;
用下面的语句可以计算出水果的总数:
total_fruit = apples + oranges;
这个语句首先计算“=”号右边的值,即苹果和桔子的总和,再把结果存储在“=”号左边的total_fruit 变量中。
等号右边的表达式可以非常复杂。如果定义了变量boys和girls,他们分别包含分享水果的男孩和女孩,用下面的语句可以计算出每个孩子得到的水果数:
int fruit_per_child = 0;
fruit_per_child = (apples + oranges) / (boys + girls);
注意可以声明变量fruit_per_child,再直接用表达式的结果对它进行初始化:
int fruit_per_child = (apples + oranges) / (boys + girls);
可以用任何表达式来初始化变量,只要所涉及的变量都已定义即可。
程序示例2.3—— 使用赋值运算符
可以把上面的代码段打包到一个可执行程序中,看看它的执行结果:
//Program 2.3 – Using the assignment operator
#include <iostream>
using std::cout;
using std::endl;
int main() {
int apples = 10;
int oranges = 6;
int boys=3;
int girls=4;
int fruit_per_child = (apples + oranges) / (boys + girls);
cout << endl
<< " Each child gets "
<< fruit_per_child<<" fruit.";
cout << endl;
return 0;
}
程序的执行结果如下所示:
Each child gets 2 fruits.
这就是上面讨论的结果。
2.5.1 多次赋值
还可以在一个语句中执行多次赋值。例如,下面的代码给apples和oranges赋予相同的值:
apples = oranges =10;
因为赋值运算符是右相关的,所以这个语句首先在oranges中存储值10,再把oranges的值存储在apples中,它相当于:
apples = (oranges =10);
这说明,表达式(oranges =10)有一个值,也就是存储在oranges中的值10。这没有什么可惊讶的。有时需要在表达式中把一个值赋予一个变量,再把该值用于其他目的。可以编写下面的语句:
fruit = (oranges =10) + (apples = 11);
这个语句在oranges中存储值10,在apples中存储值11,然后把两个变量加在一起,把结果存储在fruit中。这说明赋值表达式有一个值。但是,尽管可以编写这样的语句,但最好不要这么做。作为一个规则,应限制每个语句中的操作次数。应提高代码的清晰度,避免其含义模糊,以便于其他程序员以后理解和修改这些代码。
2.5.2 修改变量的值
因为赋值操作先计算右边的内容,再把结果存储在左边的变量中,所以可以编写下面的语句:
apples = apples *2;
这个语句使用apples的当前值,先计算右边的值apples *2,然后再把结果存储在apples变量中。因此,该语句的结果就是使存储在apples中的值翻倍。
对变量的已有值进行操作,这种情况已越来越频繁了。因此,C++提供了一种特殊形式的赋值运算符,以缩写方式表达这种表达式。
op= 赋值运算符
之所以称为op= 赋值运算符,是因为它们由一个运算符和一个等于号“=”组成。使用这样的运算符,上面使apples值翻倍的语句就可以改写为:
apples *=2;
这个语句执行的操作与上一个语句完全相同。apples变量先乘以等号右边的表达式的值,再把结果存储回apples中。等号右边的表达式可以是任意表达式。例如,下面的语句:
apples *= oranges + 2;
等价于:
apples = apples * (oranges + 2);
这里先给oranges加2,把相加的结果与存储在apples中的值相乘,再把相乘的结果存储在apples中(在此不要考虑为什么要把苹果和桔子的数量相乘)。
op= 形式的赋值也可以和加法运算符一起使用,所以,要给oranges加2,可以编写下面的语句:
oranges += 2;
这等价于:
oranges = oranges + 2;
现在就产生了一种模式。使用op= 运算符编写赋值语句的一般形式如下:
lhs op = rhs;
其中lhs是一个变量,rhs是一个表达式。这等价于语句:
lhs = lhs op (rhs);
rhs外的括号表示,表达式rhs先计算,其结果是op操作的右操作数。
注意:
lhs是lvalue,是可以赋值的一个实体。之所以称为lvalue,是因为它们出现在等号的左边。C++中每个表达式的结果都是lvalue或rvalue。rvalue是一个结果,而不是lvalue,即它不能出现在赋值操作的左边。
可以对所有的运算符使用op= 形式。表2-8是一个完整的列表,包括第3章将介绍的一些运算符。
表2-8 op=赋值运算符
|
操 作 |
运 算 符 |
操 作 |
运 算 符 |
|
加 |
+ |
按位与 |
& |
|
减 |
- |
按位或 |
| |
|
乘 |
* |
按位异或 |
^ |
|
除 |
/ |
向左移位 |
<< |
|
取模 |
% |
向右移位 |
>> |
注意在运算符和“=”之间没有空格。如果包含空格,就会出现错误。





