close

自增/自减运算符

来自cppreference.com


自增/自减运算符是使对象的值增加/减少 1 的一元运算符。

它们能拥有后缀形式:

表达式 ++
表达式 --

还有前缀形式:

++ 表达式
-- 表达式

前缀和后缀自增或自减的操作数 表达式 必须为整数类型(包含 _Bool 和枚举)、实浮点数类型或指针类型的可修改左值。它可被 cvr 限定、无限定或为原子的

后缀自增和自减运算符的结果是 表达式 的值。

前缀自增运算符的结果是将值 1 加到 表达式 的值的结果:表达式 ++e 等价于 e += 1。前缀自减运算符的结果从 表达式 减去值 1 的结果:表达式 --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+yiyi 的方式有别。

不同于 C++(和 C 的某些实现),自增/自减运算符自身决非左值:&++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");

    // 重置 a 与 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 Postfix increment and decrement operators (第 TBD 页)
  • 6.5.3.1 Prefix increment and decrement operators (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 6.5.2.4 Postfix increment and decrement operators (第 TBD 页)
  • 6.5.3.1 Prefix increment and decrement operators (第 TBD 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 6.5.2.4 Postfix increment and decrement operators (第 85 页)
  • 6.5.3.1 Prefix increment and decrement operators (第 88 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 6.5.2.4 Postfix increment and decrement operators (第 75 页)
  • 6.5.3.1 Prefix increment and decrement operators (第 78 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 3.3.2.4 Postfix increment and decrement operators
  • 3.3.3.1 Prefix increment and decrement operators

参阅

运算符优先级

常用运算符
赋值 自增
自减
算术 逻辑 比较 成员
访问
其他

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++ 文档