首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Increment/decrement operators

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

他们可以有后缀的形式:

expr ++

?

?

expr --

?

?

以及前缀形式:

++ expr

?

?

-- expr

?

?

前缀和后缀增量或减量的操作数 expr 必须是整数类型(包括_Bool和枚举),实际浮点类型或指针类型的可修改左值。它可能是 cvr 限定的,不合格的或原子的。

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

前缀递增运算符的结果是将值添加1到expr的值的结果:表达式++e等同于e+=1。前缀递减运算符的结果是1从 expr 的值中减去该值的结果:该表达式--e等同于e-=1

增量运算符会启动将1适当类型的值添加到操作数的副作用。递减运算符启动1从操作数中减去适当类型值的副作用。与任何其他副作用一样,这些操作在下一个序列点或之前完成。int a = 1; int b = a++; // stores 1+a (which is 2) to a // returns the 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+yi不同从yi

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

代码语言:javascript
复制
#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);
 
  // Reset a and 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);
}

输出:

代码语言:javascript
复制
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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com