詳解C++說話中的加法運算符與賦值運算符的用法。本站提示廣大學習愛好者:(詳解C++說話中的加法運算符與賦值運算符的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++說話中的加法運算符與賦值運算符的用法正文
加法運算符:+ 和 -
語法
expression + expression expression – expression
備注
相加運算符為:
這些二進制運算符具有從左至右的聯系關系性。
相加運算符采取算術或指針類型的操作數。加法 (+) 運算符的成果是操作數之和。減法 (–) 運算符的成果是操作數之差。假如一個操作數是指針或兩個操作數都是指針,則它們必需是指向對象的指針,而不是指向函數的指針。假如兩個操作數都是指針,則成果沒成心義,除非它們是指向統一數組中的對象的指針。
相加運算符采取 arithmetic、integral 和 scalar 類型的操作數。下表界說了這些操作數。
用於相加運算符的類型
請留意,加法和減法不是等效運算。
// expre_Additive_Operators.cpp // compile with: /EHsc #include <iostream> #define SIZE 5 using namespace std; int main() { int i = 5, j = 10; int n[SIZE] = { 0, 1, 2, 3, 4 }; cout << "5 + 10 = " << i + j << endl << "5 - 10 = " << i - j << endl; // use pointer arithmetic on array cout << "n[3] = " << *( n + 3 ) << endl; }
指針加法
在加法運算中,假如個中一個操作數是指向對象數組的指針,則另外一個操作數必需是整型。成果為與原始指針類型雷同的指針和指向另外一個數組元素的指針。以下代碼片斷論述了此概念:
short IntArray[10]; // Objects of type short occupy 2 bytes
short *pIntArray = IntArray;
for( int i = 0; i < 10; ++i ) { *pIntArray = i; cout << *pIntArray << "\n"; pIntArray = pIntArray + 1; }
固然將整數值 1 添加到 pIntArray,但這其實不表現“將 1 添加到該地址”,而是指“調劑指針使其指向數組中的下一個對象”,而該對象正好是在 2 字節(或許 sizeof( int ))以外。
留意
在 C++ 法式中很少找到 pIntArray = pIntArray + 1 情勢的代碼;若要完成遞增,以下情勢更可取:pIntArray++ 或 pIntArray += 1。
指針減法
假如兩個操作數都是指針,則減法運算的成果就是兩個操作數之差(在數組元素中)。減法表達式發生類型 ptrdiff_t(在尺度包括文件 STDDEF.H 中界說)的帶符號的整數成果。
個中一個操作數可所以整型,前提是該操作數是第二操作數。減法的成果的類型與原始指針的類型雷同。減法的值是指向第 (n – i) 個數組元素的指針,個中 n 是由原始指針指向的元素,而 i 是第二操作數的整數值。
賦值運算符
語法
expression assignment-operator expression assignment-operator : one of = *= /= %= += –= <<= >>= &= ^= |=
備注
賦值運算符將值存儲在左操作數指定的對象中。有兩種賦值操作:簡略賦值,個中第二個操作數的值存儲在第一個操作數指定的對象中;復合賦值,個中先履行算術、移位或位運算,然後再存儲成果。下表中除 = 運算符以外的一切其他賦值運算符都是復合賦值運算符。
賦值運算符
運算符症結字
三個復合賦值運算符具有文本等效項。它們是:
// 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; }
簡略賦值
簡略賦值運算符 (=) 將使第二個操作數的值存儲在第一個操作數指定的對象中。假如兩個對象都是算術類型,則在存儲值之前,准確的操作數將轉換為左邊的類型。
常量和可變類型的對象可賦給可變類型的左值或許既不是常量類型也不是可變類型的左值。
對類類型(構造、結合和類類型)的對象的賦值由名為 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 長短常量類型的可修正左值,而 e2 是以下項之一:
算術類型
指針(假如 op 為 + 或 –)
e1 op= e2 情勢的行動方法與 e1 = e1 op e2 的雷同,但 e1 只盤算一次。
對列舉類型的復合賦值將生成毛病新聞。假如左操作數屬於指針類型,則右操作數必需屬於指針類型或必需是盤算成果為 0 的常量表達式。假如左操作數屬於整數類型,則右操作數不克不及屬於指針類型。
賦值運算符的成果
賦值後,賦值運算符將前往由左操作數指定的對象的值。取得的類型是左操作數的類型。賦值表達式的成果一直為左值。這些運算符具有從右向左的聯系關系性。左操作數必需為可修正的左值。
在 ANSI C 中,賦值表達式的成果不是左值。是以,正當的 C++ 表達式 (a += b) += c 在 C 中長短法的。