# Increment/decrement operators

From cppreference.com
< c‎ | language

Increment/decrement operators are unary operators that increment/decrement the value of a variable by 1.

They can have postfix form:

expr `++` |  |
expr `--` |  |

As well as the prefix form:

`++` expr |  |
`--` expr |  |

The operand expr of both prefix and postfix increment or decrement must be a modifiable lvalue of integer type (including `_Bool` and enums), real floating type, or a pointer type. It may be cvr-qualified, unqualified, or atomic.

The result of the postfix increment and decrement operators is the value of expr.

The result of the prefix increment operator is the result of adding the value `1` to the value of expr: the expression ++e is equivalent to e+=1. The result of the prefix decrement operator is the result of subtracting the value `1` from the value of expr: the expression --e is equivalent to e-=1.

Increment operators initiate the side-effect of adding the value `1` of appropriate type to the operand. Decrement operators initiate the side-effect of subtracting the value `1` of appropriate type from the operand. As with any other side-effects, these operations complete at or before the next sequence point. int a = 1;
int b = a++; // stores 1+a (which is 2) to a
// returns the 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

Post-increment or post-decrement on any atomic variable is an atomic read-modify-write operation with memory order memory_order_seq_cst. | (since C11)

See arithmetic operators for limitations on pointer arithmetic, as well as for implicit conversions applied to the operands.

### Notes

Because of the side-effects involved, increment and decrement operators must be used with care to avoid undefined behavior due to violations of sequencing rules.

Increment/decrement operators are not defined for complex or imaginary types: the usual definition of adding/subtracting the real number 1 would have no effect on imaginary types, and making it add/subtract `i` for imaginaries but `1` for complex numbers would have made it handle `0+yi` different from `yi`.

Unlike C++ (and some implementations of C), the increment/decrement expressions are never themselves lvalues: &++a is invalid.

### Example

Run this code

    #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);
    }

Output:

    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

### References

- 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

### See Also

Operator precedence

Common operators
assignment | increment decrement | arithmetic | logical | comparison | member access | other
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 (since C11)

### See also

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=c/language/operator_incdec&oldid=79164"