名前空間
変種

インクリメント/デクリメント演算子

提供: cppreference.com

インクリメント/デクリメント演算子は変数の値を1だけインクリメント/デクリメントする単項演算子です。

これらは以下の後置形式と、

expr ++
expr --

以下の前置形式を持ちます。

++ expr
-- expr

前置および後置のインクリメントまたはデクリメントの被演算子 expr は、いずれの場合も、整数型 (_Bool および列挙を含みます)、実数浮動小数点型、またはポインタ型の変更可能な左辺値でなければなりません。 cvr 修飾されていてもされていなくても構いません。 アトミックでも構いません。

後置インクリメント演算子および後置デクリメント演算子の結果は expr の値です。

前置インクリメント演算子の結果は expr の値に値 1 を加算した結果です。 式 ++ee+=1 と同等です。 前置デクリメント演算子の結果は expr から値 1 を減算した結果です。 式 --ee-=1 と同等です。

インクリメント演算子は被演算子に適切な型の値 1 を加算する副作用を開始します。 デクリメント演算子は被演算子から適切な型の値 1 を減算する副作用を開始します。 他のあらゆる副作用と同様に、これらの演算は次の副作用完了点で完了します。 int a = 1; int b = a++; // a+1 (すなわち 2) を a に格納し、 // 以前の a の値 (すなわち 1) を返します。 // この行の後、 b == 1、 a == 2 になります。 a = 1; int c = ++a; // a+1 (すなわち 2) を a に格納し、 // 新しい a の値 (すなわち 2) を返します。 // この行の後、 c == 2、 a == 2 になります。

アトミック変数に対する後置インクリメントまたは後置デクリメントは memory_order_seq_cst メモリ順序のアトミックな読み込み-変更-書き込み操作です。

(C11以上)

ポインタ算術における制限および被演算子に適用される暗黙の変換については算術演算子を参照してください。

ノート

発生する副作用のため、インクリメントおよびデクリメント演算子は、評価順序のルールの違反による未定義動作を回避するために、注意して使用しなければなりません。

インクリメント/デクリメント演算子は複素数型および虚数型に対しては定義されません。 実数の1を加算/減算するという通常の定義は虚数型には意味がないでしょうし、虚数には i を加算/減算するけれども複素数には 1 を加算するというのは 0+yiyi を異なるものにしてしまうでしょう。

C++ と異なり、インクリメント/デクリメント式は左辺値ではありません。 &++a は無効です。

#include <stdlib.h>
#include <stdio.h>

int main(void) {

  int a = 1;
  int b = 1;

  printf("\n");
  printf("original values: a == %d, b == %d\n", a, b);
  printf("result of postfix operators: a++ == %d, b-- == %d\n", a++, b--);
  printf("after postfix operators applied: a == %d, b == %d\n", a, b);

  // Reset a and b.
  a = 1;
  b = 1;

  printf("\n");
  printf("original values: a == %d, b == %d\n", a, b);
  printf("result of prefix operators: ++a == %d, --b == %d\n", ++a, --b);
  printf("after prefix operators applied: a == %d, b == %d\n", a, b);
}

出力:

original values: a == 1, b == 1
result of postfix operators: a++ == 1, b-- == 1
after postfix operators applied: a == 2, b == 0

original values: a == 1, b == 1
result of prefix operators: ++a == 2, --b == 0
after prefix operators applied: a == 2, b == 0

参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 6.5.2.4 Postfix increment and decrement operators (p: 85)
  • 6.5.3.1 Prefix increment and decrement operators (p: 88)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.5.2.4 Postfix increment and decrement operators (p: 75)
  • 6.5.3.1 Prefix increment and decrement operators (p: 78)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.3.2.4 Postfix increment and decrement operators
  • 3.3.3.1 Prefix increment and decrement operators

関連項目

演算子の優先順位

一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバアクセス その他

a = b a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b a >>= b

++a --a a++ a--

+a -a a + b a - b a * b a / b a % b ~a a & b a | b a ^ b a << b a >> b

!a a && b a || b

a == b a != b a < b a > b a <= b a >= b

a[b] *a &a a->b a.b

a(...) a, b (type) a ? : sizeof _Alignof (C11以上)

インクリメント/デクリメント演算子C++リファレンス