命名空间
变体
操作

递增/递减运算符

来自 cppreference.cn
< c‎ | 语言

递增/递减运算符是一元运算符,用于将变量的值增加/减少 1。

它们可以有后缀形式

expr ++
expr --

以及前缀形式

++ expr
-- expr

前缀和后缀递增或递减运算符的操作数 expr 必须是可修改的左值,其类型为整数类型(包括 _Bool 和枚举)、实浮点类型或指针类型。它可以是 cvr 限定、非限定或原子类型。

后缀递增和递减运算符的结果是 expr 的值。

前缀递增运算符的结果是将值 1 添加到 expr 的值的结果:表达式 ++e 等价于 e += 1。前缀递减运算符的结果是从 expr 的值中减去值 1 的结果:表达式 --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+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");
 
    // 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 后缀递增和递减运算符 (p: TBD)
  • 6.5.3.1 前缀递增和递减运算符 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 6.5.2.4 后缀递增和递减运算符 (p: TBD)
  • 6.5.3.1 前缀递增和递减运算符 (p: TBD)
  • C11 标准 (ISO/IEC 9899:2011)
  • 6.5.2.4 后缀递增和递减运算符 (p: 85)
  • 6.5.3.1 前缀递增和递减运算符 (p: 88)
  • C99 标准 (ISO/IEC 9899:1999)
  • 6.5.2.4 后缀递增和递减运算符 (p: 75)
  • 6.5.3.1 前缀递增和递减运算符 (p: 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++ 文档,关于 递增/递减运算符