赋值运算符
语法
expression
assignment-operator
expression
assignment-operator:其中一个
= *= /= %= += -= <<= >>= &= ^= |=
注解
赋值运算符将值存储在左作数指定的对象中。 有两种类型的分配作:
简单赋值,其中第二个作数的值存储在第一个作数指定的对象中。
复合赋值,在存储结果之前执行算术、移位或按位运算。
下表中的所有赋值运算符(运算符除外 = )都是复合赋值运算符。
赋值运算符表
操作员
含义
=
将第二个作数的值存储在第一个作数(简单赋值)指定的对象中。
*=
将第一个作数的值乘以第二个作数的值;将结果存储在第一个作数指定的对象中。
/=
将第一个作数的值除以第二个作数的值;将结果存储在第一个作数指定的对象中。
%=
获取由第二个作数的值指定的第一个作数的模数;将结果存储在第一个作数指定的对象中。
+=
将第二个作数的值添加到第一个作数的值;将结果存储在第一个作数指定的对象中。
-=
从第一个作数的值中减去第二个作数的值;将结果存储在第一个作数指定的对象中。
<<=
将第一个作数的值移出由第二个作数的值指定的位数;将结果存储在第一个作数指定的对象中。
>>=
将第一个作数的值向右移动由第二个作数的值指定的位数;将结果存储在第一个作数指定的对象中。
&=
获取第一个和第二个作数的按位 AND;将结果存储在第一个作数指定的对象中。
^=
获取第一个和第二个作数的按位排他 OR;将结果存储在第一个作数指定的对象中。
|=
获取第一个和第二个作数的按位非独占 OR;将结果存储在第一个作数指定的对象中。
运算符关键字
三个复合赋值运算符具有关键字等效项。 它们分别是:
操作员
等效
&=
and_eq
|=
or_eq
^=
xor_eq
C++将这些运算符关键字指定为复合赋值运算符的替代拼写。 在 C 中,备用拼写以 iso646.h> 标头中的<宏的形式提供。 在C++中,替代拼写是关键字; <已弃用 iso646.h> 或C++等效
示例:
// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include
using namespace std;
int main() {
int a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555;
a += b; // a is 9
b %= a; // b is 6
c >>= 1; // c is 5
d |= e; // Bitwise--d is 0xFFFF
cout << "a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555" << endl
<< "a += b yields " << a << endl
<< "b %= a yields " << b << endl
<< "c >>= 1 yields " << c << endl
<< "d |= e yields " << hex << d << endl;
}
简单分配
简单赋值运算符 (=) 导致第二个作数的值存储在第一个作数指定的对象中。 如果两个对象都是算术类型,则右侧作数将转换为左侧的类型,然后存储值。
const对象和volatile类型可以分配给仅volatile属于或不是或不是const的类型volatile的 l 值。
类类型(和类型)的赋值由一个名为 a0/ a1/ /gt; 的函数执行。 此运算符函数的默认行为是执行对象的非静态数据成员和直接基类的成员复制分配;但是,可以使用重载运算符修改此行为。 有关详细信息,请参阅 运算符重载。 类类型还可以具有 复制赋值 和 移动赋值 运算符。 有关详细信息,请参阅 复制构造函数和复制赋值运算符 以及 移动构造函数和移动赋值运算符。
可以将给定基类中任何明确派生类的对象分配给基类的对象。 相反,因为存在从派生类到基类的隐式转换,而不是从基类转换为派生类。 例如:
// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include
using namespace std;
class ABase
{
public:
ABase() { cout << "constructing ABase\n"; }
};
class ADerived : public ABase
{
public:
ADerived() { cout << "constructing ADerived\n"; }
};
int main()
{
ABase aBase;
ADerived aDerived;
aBase = aDerived; // OK
aDerived = aBase; // C2679
}
对引用类型的赋值的行为就像对引用指向的对象执行赋值一样。
对于类类型对象,赋值不同于初始化。 若要说明如何进行不同的分配和初始化,请考虑代码
UserType1 A;
UserType2 B = A;
前面的代码显示初始值设定项;它调用该构造函数,该构造函数采用 UserType2 类型的 UserType1参数。 给定代码
UserType1 A;
UserType2 B;
B = A;
赋值语句
B = A;
可具有以下效果之一:
为其调用函数,提供的参数为
调用显式转换函数 UserType1::operator UserType2(如果存在此类函数)。
调用构造函数,前提是存在此类构造函数,该构造函数 UserType2::UserType2采用参数 UserType1 并复制结果。
复合赋值
复合赋值 运算符显示在赋值运算符表中。 这些运算符采用 e1op= e2 形式,其中 e1 是不可const 修改的 l 值, e2 为:
算术类型
指针(如果 作 为 + 或 -
存在 e1 类型的匹配operator *op*=重载的类型
内置 e1ope2 窗体的行为方式为 e1 e1=op= e2,但 e1 只评估一次。
对枚举类型的复合赋值将生成错误消息。 如果左侧作数是指针类型,则右作数必须是指针类型,或者必须是计算结果为 0 的常量表达式。 当左作数是整型作数时,右作数不得为指针类型。
内置赋值运算符的结果
内置赋值运算符返回赋值后左作数指定的对象值(以及复合赋值运算符的算术/逻辑运算)。 结果类型是左作数的类型。 赋值表达式的结果始终为 l 值。 这些运算符具有从右到左的关联性。 左作数必须是可修改的 l 值。
在 ANSI C 中,赋值表达式的结果不是 l 值。 这意味着 C 中不允许合法C++表达式 (a += b) += c 。
另请参阅
具有二进制运算符的表达式
C++内置运算符、优先级和关联性
C 赋值运算符