Namespaces
Variants

Increment/decrement operators

From cppreference.net

Los operadores de incremento/decremento son operadores unarios que incrementan/decrementan el valor de una variable en 1.

Pueden tener forma postfija:

expr ++
expr --

Así como la forma de prefijo:

++ expr
-- expr

El operando expr tanto del incremento como del decremento prefijo y postfijo debe ser un lvalue modificable de tipo entero (incluyendo _Bool y enumeraciones), tipo flotante real, o un tipo puntero. Puede estar calificado cvr, no calificado, o ser atómico .

El resultado de los operadores de incremento y decremento postfijos es el valor de expr .

El resultado del operador de incremento prefijo es el resultado de sumar el valor 1 al valor de expr : la expresión ++ e es equivalente a e + = 1 . El resultado del operador de decremento prefijo es el resultado de restar el valor 1 del valor de expr : la expresión -- e es equivalente a e - = 1 .

Los operadores de incremento inician el efecto secundario de agregar el valor 1 del tipo apropiado al operando. Los operadores de decremento inician el efecto secundario de restar el valor 1 del tipo apropiado del operando. Como con cualquier otro efecto secundario, estas operaciones se completan en o antes del siguiente punto de secuencia .

int a = 1;
int b = a++; // almacena 1+a (que es 2) en a
             // retorna el valor antiguo de a (que es 1)
             // Después de esta línea, b == 1 y a == 2
a = 1;
int c = ++a; // almacena 1+a (que es 2) en a
             // retorna 1+a (que es 2)
             // después de esta línea, c == 2 y a == 2

El post-incremento o post-decremento en cualquier variable atómica es una operación atómica de lectura-modificación-escritura con orden de memoria memory_order_seq_cst .

(desde C11)

Consulte operadores aritméticos para conocer las limitaciones de la aritmética de punteros, así como las conversiones implícitas aplicadas a los operandos.

Contenidos

Notas

Debido a los efectos secundarios involucrados, los operadores de incremento y decremento deben usarse con cuidado para evitar comportamiento indefinido debido a violaciones de las reglas de secuenciación .

Los operadores de incremento/decremento no están definidos para tipos complejos o imaginarios: la definición habitual de sumar/restar el número real 1 no tendría efecto en tipos imaginarios, y hacer que sume/reste i para imaginarios pero 1 para números complejos habría hecho que maneje 0+yi diferente de yi .

A diferencia de C++ (y algunas implementaciones de C), las expresiones de incremento/decremento nunca son lvalues por sí mismas: & ++ a es inválido.

Ejemplo

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a = 1;
    int b = 1;
    printf("valores originales: a == %d, b == %d\n", a, b);
    printf("resultado de operadores postfijos: a++ == %d, b-- == %d\n", a++, b--);
    printf("después de aplicar operadores postfijos: a == %d, b == %d\n", a, b);
    printf("\n");
    // Reset a and b.
    a = 1;
    b = 1;
    printf("valores originales: a == %d, b == %d\n", a, b);
    printf("resultado de operadores prefijos: ++a == %d, --b == %d\n", ++a, --b);
    printf("después de aplicar operadores prefijos: a == %d, b == %d\n", a, b);
}

Salida:

valores originales: a == 1, b == 1
resultado de operadores postfijos: a++ == 1, b-- == 1
después de aplicar operadores postfijos: a == 2, b == 0
valores originales: a == 1, b == 1
resultado de operadores prefijos: ++a == 2, --b == 0
después de aplicar operadores prefijos: a == 2, b == 0

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 6.5.2.4 Operadores de incremento y decremento postfijos (p: TBD)
  • 6.5.3.1 Operadores de incremento y decremento prefijos (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.5.2.4 Operadores de incremento y decremento postfijos (p: TBD)
  • 6.5.3.1 Operadores de incremento y decremento prefijos (p: TBD)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.5.2.4 Operadores de incremento y decremento postfijos (p: 85)
  • 6.5.3.1 Operadores de incremento y decremento prefijos (p: 88)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.5.2.4 Operadores de incremento y decremento postfijos (p: 75)
  • 6.5.3.1 Operadores de incremento y decremento prefijos (p: 78)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.3.2.4 Operadores de incremento y decremento postfijos
  • 3.3.3.1 Operadores de incremento y decremento prefijos

Véase también

Precedencia de operadores

Operadores comunes
asignación incremento
decremento
aritméticos lógicos comparación acceso a
miembros
otros

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
(desde C11)
(hasta C23)

alignof
(desde C23)

Documentación de C++ para Operadores de incremento/decremento