指派運算子

語法

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;
}

單一指派

簡單指派運算子 (=) 會使第二個運算元的值儲存在第一個運算元指定的物件中。 如果兩個物件都是算術型別,則右運算元會在儲存值之前轉換成左運算元的型別。

constvolatile 型別的物件可以指派給僅為 volatile、或者非 constvolatile 之型別的左值。

類別型別 (structunionclass 型別) 的物件指派是由名為 operator= 的函式執行。 此運算子函式的預設行為是執行物件非靜態資料成員和直接基底類別的成員複製指派;不過,您可以使用多載運算子來修改此行為。 如需詳細資訊,請參閱運算子多載。 類別型別也可以有「複製指派」和「移動指派」運算元。 如需詳細資訊,請參閱複製建構函式和複製指派運算子 (部分機器翻譯) 和移動建構函式和移動指派運算子 (部分機器翻譯)。

只要物件是從指定基底類別明確衍生的任何類別,就可以指派給該基底類別的物件。 反向則不成立,因為可從衍生類別隱含轉換為基底類別,但無法從基底類別轉換為衍生類別。 例如:

// 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;

可能會有下列其中一項作用:

  • 針對 UserType2 呼叫函式 operator=,前提是必須將 operator=UserType1 引數一起提供。

  • 如果 UserType1::operator UserType2 函式存在,呼叫這類明確轉換函式。

  • 呼叫建構函式 UserType2::UserType2,前提是這類建構函式存在,而且接受 UserType1 引數並複製結果。

複合指派

複合指派運算子顯示在指派運算子資料表中。 這些運算子的格式為 e1 op= e2,其中 e1 為非 const 可修改的左值,而 e2 為:

  • 算術型別

  • 如果 op+-,則為指標

  • 存在與 e1 型別的 operator *op*= 多載相符的型別

內建的 e1 op= e2 表單與 e1= e1 op e2 的行為相同,但 e1 只會被評估一次。

對列舉類型的複合指派會產生錯誤訊息。 如果左運算元為指標型別,則右運算元必須是指標型別,或者必須是判斷值為 0 的常數運算式。 如果左運算元為整數型別,則右運算元不能是指標型別。

內建指派運算子的結果

內建指派運算子會在指派之後傳回左運算元指定的物件值 (以及複合指派運算子的算術/邏輯運算)。 結果的類型會是左運算元的類型。 指派運算式的結果一律是左值。 這些運算子具有由右到左的順序關聯性。 左運算元必須是可修改的左值。

在 ANSI C 中,指派運算式的結果不是左值。 這表示 C 中不允許合法的 C++ 運算式 (a += b) += c

另請參閱

具有二元運算子的運算式 (部分機器翻譯)
C++ 內建運算子、優先順序和關聯性 (部分機器翻譯)
C 指派運算子 (部分機器翻譯)