Namespaces
Variants

Increment/decrement operators

From cppreference.net

インクリメント/デクリメント演算子は、変数の値を1だけ増加/減少させる単項演算子です。

これらは後置形式を持つことができます:

++
--

同様に前置形式:

++
--

前置および後置のインクリメントまたはデクリメントの被演算子 expr は、 modifiable lvalue でなければならず、その型は integer type _Bool および列挙型を含む)、実浮動小数点型、またはポインタ型である必要があります。cv修飾、非修飾、または atomic である可能性があります。

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

前置インクリメント演算子の結果は、値 1 expr の値に加算した結果である:式 ++ e e + = 1 と等価である。前置デクリメント演算子の結果は、値 1 expr の値から減算した結果である:式 -- e e - = 1 と等価である。

インクリメント演算子は、オペランドに適切な型の値 1 を加算する副作用を引き起こします。デクリメント演算子は、オペランドから適切な型の値 1 を減算する副作用を引き起こします。他の副作用と同様に、これらの操作は次の シーケンスポイント までに完了します。

int a = 1;
int b = a++; // 1+a(つまり2)をaに格納
             // aの古い値(つまり1)を返す
             // この行の後、b == 1 かつ a == 2
a = 1;
int c = ++a; // 1+a(つまり2)をaに格納
             // 1+a(つまり2)を返す
             // この行の後、c == 2 かつ a == 2

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

(C11以降)

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

目次

注記

副作用が関与するため、インクリメントおよびデクリメント演算子は、 シーケンシング規則 の違反による未定義動作を避けるために注意して使用する必要があります。

インクリメント/デクリメント演算子は複素数型または虚数型に対して定義されていません:実数1を加算/減算する通常の定義は虚数型に対して効果がなく、虚数に対しては i を加算/減算し、複素数に対しては 1 を加算/減算するようにすると、 0+yi yi を異なる方法で扱うことになってしまうためです。

C++(および一部のC実装)とは異なり、インクリメント/デクリメント式自体が左値になることはありません: & ++ a は無効です。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a = 1;
    int b = 1;
    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);
    printf("\n");
    // Reset a and b.
    a = 1;
    b = 1;
    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

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.5.2.4 後置インクリメントおよびデクリメント演算子 (p: 未定)
  • 6.5.3.1 前置インクリメントおよびデクリメント演算子 (p: 未定)
  • C17規格 (ISO/IEC 9899:2018):
  • 6.5.2.4 後置インクリメントおよびデクリメント演算子 (p: TBD)
  • 6.5.3.1 前置インクリメントおよびデクリメント演算子 (p: TBD)
  • C11規格 (ISO/IEC 9899:2011):
  • 6.5.2.4 後置インクリメントおよびデクリメント演算子 (p: 85)
  • 6.5.3.1 前置インクリメントおよびデクリメント演算子 (p: 88)
  • C99規格 (ISO/IEC 9899:1999):
  • 6.5.2.4 後置インクリメントおよびデクリメント演算子 (p: 75)
  • 6.5.3.1 前置インクリメントおよびデクリメント演算子 (p: 78)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 3.3.2.4 後置インクリメントおよびデクリメント演算子
  • 3.3.3.1 前置インクリメントおよびデクリメント演算子

関連項目

演算子の優先順位

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

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
a ? b : c
sizeof


_Alignof
(C11以降)
(C23まで)

alignof
(C23以降)

C++ ドキュメント for Increment/decrement operators