前置インクリメント演算子と前置デクリメント演算子: ++ および --
++ unary-expression –– unary-expression
解説
前置インクリメント演算子 (++) は、オペランドに 1 を追加します。このインクリメントされた値が式の結果になります。 オペランドは const 型でない左辺値である必要があります。 結果は、オペランドと同じ型の左辺値です。
前置デクリメント演算子 (––) は、前置インクリメント演算子と似ていますが、オペランドから 1 が減算され、結果はこのデクリメントされた値となります。
前置および後置インクリメントおよびデクリメント演算子は、オペランドに影響します。 これらの主要な違いは、式の評価でインクリメントまたはデクリメントが発生する順序です。 詳細については、後置インクリメント演算子と後置デクリメント演算子のトピックを参照してください。前置形式では、値が式評価で使用される前にインクリメントまたはデクリメントが発生するため、式の値はオペランドの値と異なります。 後置形式では、値が式評価で使用された後にインクリメントまたはデクリメントが発生するため、式の値はオペランドの値と同じになります。 たとえば、次のプログラムでは、"++i = 6" と出力されます。
// expre_Increment_and_Decrement_Operators.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main() {
int i = 5;
cout << "++i = " << ++i << endl;
}
整数または浮動小数点型のオペランドは、整数値 1 ずつインクリメントまたはデクリメントされます。 結果の型は、オペランドの型と同じです。 ポインター型のオペランドは、アドレス指定するオブジェクトのサイズだけインクリメントまたはデクリメントされます。 インクリメントされたポインターは、次のオブジェクトを指します。デクリメントされたポインターは、前のオブジェクトを指します。
インクリメントおよびデクリメント演算子には副作用があるため、プリプロセッサ マクロでインクリメントまたはデクリメント演算子を含む式を使用すると、望ましくない結果になることがあります。 次の例について考えます。
// expre_Increment_and_Decrement_Operators2.cpp
#define max(a,b) ((a)<(b))?(b):(a)
int main()
{
int i = 0, j = 0, k;
k = max( ++i, j );
}
マクロは次のように展開されます。
k = ((++i)<(j))?(j):(++i);
i が j 以上であるか、j より 1 少ない場合、2 回インクリメントされます。
注意
C++ のインライン関数は、ここで説明したような副作用をなくし、言語でより完全な型チェックを実行できるため、多くの場合、マクロよりも適しています。