Namespaces
Variants

Increment/decrement operators

From cppreference.net

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

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

expr ++
expr --

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

++ expr
-- expr
**Примечание:** В данном HTML-коде нет текста для перевода, кроме термина "expr", который является C++ специфическим термином (сокращение от expression - выражение) и не подлежит переводу согласно вашим требованиям. Весь остальной контент состоит из HTML-тегов, атрибутов и C++ операторов (++, --), которые должны оставаться без изменений.

Операнд expr как префиксного, так и постфиксного инкремента или декремента должен быть изменяемым lvalue типа integer (включая _Bool и перечисления), real floating type, или pointer type. Он может быть cvr-квалифицированным, неквалифицированным или 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), выражения инкремента/декремента сами никогда не являются 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 Постфиксные операторы инкремента и декремента (стр.: 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)
(до C23)

alignof
(начиная с C23)

C++ documentation для Increment/decrement operators