詳解C++語言中的加法運算符與賦值運算符的用法
加法運算符:+ 和 -
語法
expression + expression expression – expression
備注
相加運算符為:
- 加 (+)
 - 減 (–)
 
這些二進制運算符具有從左至右的關(guān)聯(lián)性。
相加運算符采用算術(shù)或指針類型的操作數(shù)。加法 (+) 運算符的結(jié)果是操作數(shù)之和。減法 (–) 運算符的結(jié)果是操作數(shù)之差。如果一個操作數(shù)是指針或兩個操作數(shù)都是指針,則它們必須是指向?qū)ο蟮闹羔?,而不是指向函?shù)的指針。如果兩個操作數(shù)都是指針,則結(jié)果沒有意義,除非它們是指向同一數(shù)組中的對象的指針。
相加運算符采用 arithmetic、integral 和 scalar 類型的操作數(shù)。下表定義了這些操作數(shù)。
用于相加運算符的類型
| S.N. | 構(gòu)造函數(shù) & 描述 | 
|---|---|
| arithmetic | 整型和浮點類型統(tǒng)稱為“算術(shù)”類型。 | 
| integral | 所有大小(long、short)和枚舉數(shù)的 char 和 int 類型為“整數(shù)”類型。 | 
| scalar | 標(biāo)量操作數(shù)是算術(shù)類型或指針類型的操作數(shù)。 | 
這些運算符的合法組合為:
- 算術(shù) + 算術(shù)
 - 標(biāo)量 + 整數(shù)
 - 整數(shù) + 標(biāo)量
 - 算術(shù) – 算術(shù)
 - 標(biāo)量 – 標(biāo)量
 
請注意,加法和減法不是等效運算。
// 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;
}
指針加法
在加法運算中,如果其中一個操作數(shù)是指向?qū)ο髷?shù)組的指針,則另一個操作數(shù)必須是整型。結(jié)果為與原始指針類型相同的指針和指向另一個數(shù)組元素的指針。以下代碼片段闡述了此概念:
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;
}
雖然將整數(shù)值 1 添加到 pIntArray,但這并不表示“將 1 添加到該地址”,而是指“調(diào)整指針使其指向數(shù)組中的下一個對象”,而該對象恰好是在 2 字節(jié)(或者 sizeof( int ))之外。
注意
在 C++ 程序中很少找到 pIntArray = pIntArray + 1 形式的代碼;若要實現(xiàn)遞增,以下形式更可?。簆IntArray++ 或 pIntArray += 1。
指針減法
如果兩個操作數(shù)都是指針,則減法運算的結(jié)果就是兩個操作數(shù)之差(在數(shù)組元素中)。減法表達式產(chǎn)生類型 ptrdiff_t(在標(biāo)準(zhǔn)包含文件 STDDEF.H 中定義)的帶符號的整數(shù)結(jié)果。
其中一個操作數(shù)可以是整型,條件是該操作數(shù)是第二操作數(shù)。減法的結(jié)果的類型與原始指針的類型相同。減法的值是指向第 (n – i) 個數(shù)組元素的指針,其中 n 是由原始指針指向的元素,而 i 是第二操作數(shù)的整數(shù)值。
賦值運算符
語法
    expression assignment-operator expression 
assignment-operator : one of
  =  *=  /=  %=  +=  –=  <<=  >>=  &=  ^=  |=
備注
賦值運算符將值存儲在左操作數(shù)指定的對象中。有兩種賦值操作:簡單賦值,其中第二個操作數(shù)的值存儲在第一個操作數(shù)指定的對象中;復(fù)合賦值,其中先執(zhí)行算術(shù)、移位或位運算,然后再存儲結(jié)果。下表中除 = 運算符之外的所有其他賦值運算符都是復(fù)合賦值運算符。
賦值運算符
| 運算符 | 含義 | 
|---|---|
| = | 整型和浮點類型統(tǒng)稱為“算術(shù)”類型。 | 
| *= | 所有大?。╨ong、short)和枚舉數(shù)的 char 和 int 類型為“整數(shù)”類型。 | 
| /= | 標(biāo)量操作數(shù)是算術(shù)類型或指針類型的操作數(shù)。 | 
| %= | 整型和浮點類型統(tǒng)稱為“算術(shù)”類型。 | 
| += | 所有大?。╨ong、short)和枚舉數(shù)的 char 和 int 類型為“整數(shù)”類型。 | 
| –= | 標(biāo)量操作數(shù)是算術(shù)類型或指針類型的操作數(shù)。 | 
| <<= | 將第一個操作數(shù)的值按第二個操作數(shù)的值指定的位數(shù)左移;將結(jié)果存儲在第一個操作數(shù)指定的對象中。 | 
| >>= | 將第一個操作數(shù)的值按第二個操作數(shù)的值指定的位數(shù)右移;將結(jié)果存儲在第一個操作數(shù)指定的對象中。 | 
| &= | 獲取第一個和第二個操作數(shù)的按位“與”;將結(jié)果存儲在第一個操作數(shù)指定的對象中。 | 
| ^= | 獲取第一個和第二個操作數(shù)的按位“異或”;將結(jié)果存儲在第一個操作數(shù)指定的對象中。 | 
| |= | 獲取第一個和第二個操作數(shù)的按位“與或”;將結(jié)果存儲在第一個操作數(shù)指定的對象中。 | 
運算符關(guān)鍵字
三個復(fù)合賦值運算符具有文本等效項。它們是:
| 運算符 | 等效 | 
|---|---|
| &= | and_eq | 
| |= | or_eq | 
| ^= | xor_eq | 
在您的程序中有兩種訪問這些運算符關(guān)鍵字的方法:包括標(biāo)頭文件 iso646.h 或使用 /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;
}
簡單賦值
簡單賦值運算符 (=) 將使第二個操作數(shù)的值存儲在第一個操作數(shù)指定的對象中。如果兩個對象都是算術(shù)類型,則在存儲值之前,正確的操作數(shù)將轉(zhuǎn)換為左側(cè)的類型。
常量和可變類型的對象可賦給可變類型的左值或者既不是常量類型也不是可變類型的左值。
對類類型(結(jié)構(gòu)、聯(lián)合和類類型)的對象的賦值由名為 operator= 的函數(shù)執(zhí)行。此運算符函數(shù)值的默認行為是執(zhí)行按位復(fù)制;但是,可使用重載運算符修改此行為。(有關(guān)詳細信息,請參閱重載運算符。)
任何從給定基類明確派生的類的對象均可賦給基類的對象。反之則不然,因為有一個隱式轉(zhuǎn)換,它能從派生類轉(zhuǎn)換到基類,但不能從基類轉(zhuǎn)換到派生類。例如:
// 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;
上面的代碼顯示了一個初始值設(shè)定項;它調(diào)用了采用 UserType2 類型的參數(shù)的 UserType1 的構(gòu)造函數(shù)。給定以下代碼
UserType1 A; UserType2 B; B = A;
賦值語句
B = A;
可能具有以下效果之一:
將為 UserType2 調(diào)用函數(shù) operator=,前提是 operator= 提供 UserType1 參數(shù)。
如果存在顯式轉(zhuǎn)換函數(shù) UserType1::operator UserType2,則調(diào)用該函數(shù)。
調(diào)用采用 UserType2::UserType2 參數(shù)并復(fù)制結(jié)果的構(gòu)造函數(shù) UserType1,前提是存在此類構(gòu)造函數(shù)。
復(fù)合賦值
顯示在的表中的復(fù)合賦值運算符以 e1 op= e2 的形式指定,其中 e1 是非常量類型的可修改左值,而 e2 是以下項之一:
算術(shù)類型
指針(如果 op 為 + 或 –)
e1 op= e2 形式的行為方式與 e1 = e1 op e2 的相同,但 e1 只計算一次。
對枚舉類型的復(fù)合賦值將生成錯誤消息。如果左操作數(shù)屬于指針類型,則右操作數(shù)必須屬于指針類型或必須是計算結(jié)果為 0 的常量表達式。如果左操作數(shù)屬于整數(shù)類型,則右操作數(shù)不能屬于指針類型。
賦值運算符的結(jié)果
賦值后,賦值運算符將返回由左操作數(shù)指定的對象的值。獲得的類型是左操作數(shù)的類型。賦值表達式的結(jié)果始終為左值。這些運算符具有從右向左的關(guān)聯(lián)性。左操作數(shù)必須為可修改的左值。
在 ANSI C 中,賦值表達式的結(jié)果不是左值。因此,合法的 C++ 表達式 (a += b) += c 在 C 中是非法的。
上一篇:如何用C語言畫一個“圣誕樹”
欄 目:C語言
本文標(biāo)題:詳解C++語言中的加法運算符與賦值運算符的用法
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2579.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
 - 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘
 


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
 - 01-10delphi制作wav文件的方法
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 01-10C#中split用法實例總結(jié)
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 04-02jquery與jsp,用jquery
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 


