自增/自减运算符

< c‎ | language

自增/自减运算符是使对象的值增加/减少 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++; // 存储 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 <stdlib.h>
#include <stdio.h>
 
int main(void) {
 
  int a = 1;
  int b = 1;
 
  printf("\n");
  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);
 
  // 重置 a 与 b 。
  a = 1;
  b = 1;
 
  printf("\n");
  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

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 6.5.2.4 Postfix increment and decrement operators (p: 85)
  • 6.5.3.1 Prefix increment and decrement operators (p: 88)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.5.2.4 Postfix increment and decrement operators (p: 75)
  • 6.5.3.1 Prefix increment and decrement operators (p: 78)
  • C89/C90 standard (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
? :
sizeof
_Alignof
(C11 起)