語法
expression
assignment-operator
expression
assignment-operator:其中一個
= *= /= %= += -= <<= >>= &= ^= |=
備註
指派運算子會將值儲存在左作數所指定的物件中。 指派作業有兩種:
簡單指派,其中第二個作數的值會儲存在第一個作數所指定的物件中。
複合指派,其中會先執行算術、移位或位運算,再儲存結果。
下表中的所有指派運算符都是複合指派運算符,但運算元除外 = 。
指派運算符數據表
| 操作員 | 意義 |
|---|---|
= |
將第二個作數的值儲存在第一個作數所指定的物件中(簡單指派)。 |
*= |
將第一個作數的值乘以第二個作數的值;將結果儲存在第一個作數所指定的物件中。 |
/= |
將第一個作數的值除以第二個作數的值;將結果儲存在第一個作數所指定的物件中。 |
%= |
取得第二個作數值所指定之第一個作數的模數;將結果儲存在第一個作數所指定的物件中。 |
+= |
將第二個作數的值新增至第一個作數的值;將結果儲存在第一個作數所指定的物件中。 |
-= |
從第一個作數的值減去第二個作數的值;將結果儲存在第一個作數所指定的物件中。 |
<<= |
將第一個作數的值移出第二個作數值所指定的位數;將結果儲存在第一個作數所指定的物件中。 |
>>= |
將第一個作數的值向右移第二個作數的值,將結果儲存在第一個作數所指定的物件中。 |
&= |
取得第一個和第二個作數的位 AND;將結果儲存在第一個作數所指定的物件中。 |
^= |
取得第一個和第二個作數的位互斥 OR;將結果儲存在第一個作數所指定的物件中。 |
|= |
取得第一個和第二個作數的位內含 OR;將結果儲存在第一個作數所指定的物件中。 |
運算元關鍵詞
其中三個複合指派運算符具有關鍵詞對等專案。 他們是:
| 操作員 | 對應項 |
|---|---|
&= |
and_eq |
|= |
or_eq |
^= |
xor_eq |
C++將這些運算符關鍵詞指定為複合指派運算符的替代拼字。 在 C 中,替代拼字會以 iso646.h> 標頭中的<巨集的形式提供。 在C++中,替代拼字是關鍵詞; <使用 iso646.h> 或C++對等 <的 ciso646> 已被取代。 在Microsoft C++中, /permissive- 需要 或 /Za 編譯程式選項才能啟用替代拼字。
範例
// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include <iostream>
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 值。
類別型別的物件指派(struct、 union和 class 型別)是由名為 operator=的函式執行。 此運算子函式的預設行為是執行物件非靜態數據成員和直接基類的成員複製指派;不過,您可以使用多載運算符來修改此行為。 如需詳細資訊,請參閱 運算元多載。 類別類型也可以有 複製指派 和 移動指派 運算元。 如需詳細資訊,請參閱 複製建構函式和複製指派運算符 和 移動建構函式和移動指派運算元。
任何明確衍生類別的物件都可以指派給基類的物件。 反向不是 true,因為有從衍生類別到基類的隱含轉換,而不是從基類轉換成衍生類別。 例如:
// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
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;
可以有下列其中一個效果:
針對呼叫 的函式
operator=UserType2,提供的operator=函式會以UserType1自變數提供。如果這類函式存在,請呼叫明確的轉換函
UserType1::operator UserType2式。呼叫建構函式 ,前提是這類建構
UserType2::UserType2函式存在,它會接受UserType1自變數並複製結果。
複合指派
複合指派運算子會顯示在 Assignment 運算符數據表中。 這些運算子的格式 為 e1op= e2,其中 e1 是不可const 修改的 l 值, e2 為:
算術類型
如果 op 為
+或 ,則為指標-有 e1 型別的相符
operator *op*=多載
內建 e1ope2 窗體的行為為 e1 e1=op= e2,但 e1 只會評估一次。
列舉型別的複合指派會產生錯誤訊息。 如果左作數是指針類型,則右作數必須是指針類型,或者必須是評估為0的常數表達式。 當左作數是整數類型時,右作數不得為指標類型。
內建指派運算子的結果
內建指派運算子會在指派之後傳回左作數所指定的物件值(以及複合指派運算子的算術/邏輯運算)。 結果型別是左作數的類型。 指派表達式的結果一律為 l 值。 這些運算元具有由右至左的關聯性。 左作數必須是可修改的 l 值。
在 ANSI C 中,指派表達式的結果不是 l 值。 這表示 C 中不允許合法的C++運算式 (a += b) += c 。