加法演算子: +
と -
構文
expression + expression
expression - expression
解説
加法演算子を次に示します。
加算 (+)
減算 (-)
これらの二項演算子の結合規則は、左から右方向です。
加法演算子は、数値型またはポインター型のオペランドを受け取ります。 加算 (+) 演算子の結果はオペランドの合計です。 減算 (-) 演算子の結果はオペランド間の差です。 オペランドの一方または両方がポインターの場合、これらのオペランドは、関数ではなくオブジェクトのポインターである必要があります。 両方のオペランドがポインターの場合、両方とも同じ配列のオブジェクトへのポインターでない限り意味がありません。
加法演算子は、演算型、整数型、スカラー型のオペランドを受け取ります。 次の表にこれらの定義を示します。
加法演算子と併用される型
Type | 説明 |
---|---|
算術 | 整数型および浮動型はまとめて "演算" 型と呼ばれます。 |
整数型 | すべてのサイズ (long、short) の char 型と int 型、および列挙型は "整数" 型です。 |
スカラー型 | スカラー オペランドは、数値型またはポインター型のオペランドです。 |
これらの演算子の有効な組み合わせは以下のとおりです。
演算型 + 演算型
スカラー型 + スカラー型
整数型 + スカラー型
演算型 - 演算型
スカラー型 - スカラー型
加算と減算が同等の操作ではないことに注意してください。
オペランドが両方とも演算型である場合、「標準変換」で説明されている変換がオペランドに適用され、結果は変換後の型になります。
例
// 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;
}
ポインターの加算
加算演算のオペランドの 1 つがオブジェクトの配列へのポインターである場合、もう一方は整数型である必要があります。 結果は、元のポインターと同じ型のポインターで、他の配列要素をポイントします。 この概念を次のコードに示します。
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 )
) 移動するように、"配列内の次のオブジェクトを指すようにポインターを調整する" ことを意味します。
Note
pIntArray = pIntArray + 1
のような形式のコードは、C++ プログラムではあまり見られません。インクリメントを行う場合は、pIntArray++
または pIntArray += 1
のような形式を使用することをお勧めします。
ポインターの減算
両方のオペランドがポインターの場合、減算の結果は、オペランド間の (配列要素内の) 差になります。 減算式は ptrdiff_t
型 (標準インクルード ファイル <stddef.h> で定義) の符号付き整数の結果を生成します。
それが 2 番目のオペランドである限り、オペランドの 1 つは整数型にできます。 減算の結果は、元のポインターと同じ型です。 減算の値は (n - i) 番目の配列要素へのポインターです。n は元のポインターが指す要素、i は 2 番目のオペランドの整数値です。