Namespaces
Variants

Increment/decrement operators

From cppreference.net

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

它们可以具有后缀形式:

表达式 ++
表达式 --

同样地,前缀形式:

++ 表达式
-- 表达式

前缀与后缀自增或自减操作的操作数 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 内存顺序的原子读-修改-写操作。

(since C11)

请参阅 算术运算符 了解指针算术的限制,以及应用于操作数的隐式转换规则。

目录

注释

由于涉及副作用,必须谨慎使用递增和递减运算符,以避免因违反 顺序规则 而导致未定义行为。

递增/递减运算符未为复数或虚数类型定义:通常加减实数1的定义对虚数类型没有影响,而若使其对虚数加减 i 、对复数加减 1 ,则会导致处理 0+yi yi 时产生差异。

与C++(以及某些C语言实现)不同,自增/自减表达式本身永远不会是左值: & ++ a 是无效的。

示例

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a = 1;
    int b = 1;
    printf("原始值: a == %d, b == %d\n", a, b);
    printf("后缀运算符结果: a++ == %d, b-- == %d\n", a++, b--);
    printf("应用后缀运算符后: a == %d, b == %d\n", a, b);
    printf("\n");
    // 重置 a 和 b
    a = 1;
    b = 1;
    printf("原始值: a == %d, b == %d\n", a, b);
    printf("前缀运算符结果: ++a == %d, --b == %d\n", ++a, --b);
    printf("应用前缀运算符后: a == %d, b == %d\n", a, b);
}

输出:

原始值: a == 1, b == 1
后缀运算符结果: a++ == 1, b-- == 1
应用后缀运算符后: a == 2, b == 0
原始值: a == 1, b == 1
前缀运算符结果: ++a == 2, --b == 0
应用前缀运算符后: 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 后缀递增和递减运算符(页码: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++ 文档 关于 自增/自减运算符