名前空間
変種
操作

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

From cppreference.com
< c‎ | language

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

後置形式があります

++
--

前置形式もあります

++
--

前置および後置インクリメントまたはデクリメントの両方のオペランド は、変更可能なlvalueで、整数型_Boolおよび列挙型を含む)、実数浮動小数点型、またはポインタ型である必要があります。cvr修飾されている、修飾されていない、またはアトミックである可能性があります。

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

前置インクリメント演算子の結果は、 の値に値 1 を加えた結果です。式 ++e は、式 e += 1 と同等です。前置デクリメント演算子の結果は、 の値から値 1 を引いた結果です。式 --e は、式 e -= 1 と同等です。

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

int a = 1;
int b = a++; // stores 1+a (which is 2) to a
             // returns the old value of a (which is 1)
             // After this line, b == 1 and a == 2
a = 1;
int c = ++a; // stores 1+a (which is 2) to a
             // returns 1+a (which is 2)
             // after this line, c == 2 and a == 2

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

(C11 以降)

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

目次

[編集] 注記

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

インクリメント/デクリメント演算子は、複素数型または虚数型では定義されていません。実数 1 を加算/減算するという通常の定義は、虚数型には影響しません。虚数型では i を加算/減算し、複素数型では 1 を加算/減算するようにすると、0+yiyi とは異なるように扱われることになります。

C++(およびCの一部の実装)とは異なり、インクリメント/デクリメント式自体はlvalueになることはありません。&++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: TBD)
  • 6.5.3.1 前置インクリメントおよびデクリメント演算子 (p: TBD)
  • 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++ドキュメントインクリメント/デクリメント演算子
English 日本語 中文(简体) 中文(繁體)