Increment/decrement operators
Операторы инкремента/декремента — это унарные операторы, которые увеличивают/уменьшают значение переменной на 1.
Они могут иметь постфиксную форму:
expr
++
|
|||||||||
expr
--
|
|||||||||
А также префиксная форма:
++
expr
|
|||||||||
--
expr
|
|||||||||
Операнд
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
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
|
C++ documentation
для
Increment/decrement operators
|