Spec-Zone.ru › C

Операторы инкремента/декремента

Операторы инкремента/декремента — это унарные операторы, которые увеличивают/уменьшают значение переменной на 1.

Они могут иметь постфиксную форму:

expr ++
expr --

А также префиксную форму:

++ expr
-- expr

Операнд expr как для префиксного, так и для постфиксного инкремента или декремента должен быть модифицируемым lvalue целого типа (включая _Bool и перечисления), вещественного плавающего типа или указателя. Он может быть квалифицирован или нет модификаторами cvr или атомным.

Результат постфиксных операторов инкремента и декремента — это значение expr.

Результат префиксного оператора инкремента — это результат сложения значения 1 к значению expr: выражение ++e эквивалентно e += 1. Результат префиксного оператора декремента — это результат вычитания значения 1 из значения expr: выражение --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+yi отличной от yi.

В отличие от 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:2023):
    • 6.5.2.4 Операторы постфиксного инкремента и декремента (стр: TBD)
    • 6.5.3.1 Операторы префиксного инкремента и декремента (стр: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 6.5.2.4 Операторы постфиксного инкремента и декремента (стр: TBD)
    • 6.5.3.1 Операторы префиксного инкремента и декремента (стр: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 6.5.2.4 Операторы постфиксного инкремента и декремента (стр: 85)
    • 6.5.3.1 Операторы префиксного инкремента и декремента (стр: 88)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 6.5.2.4 Операторы постфиксного инкремента и декремента (стр: 75)
    • 6.5.3.1 Операторы префиксного инкремента и декремента (стр: 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)

Документация C++ для операторов инкремента/декремента

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/operator_incdec

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API