¿Concepto de post-incremento y pre-incremento?

4 minutos de lectura

¿Concepto de post incremento y pre incremento
Saad Masud

No entiendo el concepto de incremento o disminución de sufijo y prefijo. ¿Alguien puede dar una mejor explicación?

  • Posible duplicado de ¿Cuál es la diferencia entre ++i y i++?

    – TylerH

    27/07/2016 a las 21:56

  • o tal vez Incrementando en C++ – ¿Cuándo usar x++ o ++x? (o, lo más probable, decenas de otros)

    – subrayado_d

    29/09/2018 a las 22:52

  • Si entiendes hindi :), esto explica muy claramente youtube.com/watch?v=yRt-zYFJIvE

    – Deepak

    15 de junio de 2020 a las 19:31

¿Concepto de post incremento y pre incremento
Saludos y hth. – alf

Las cuatro respuestas hasta ahora son incorrectoen el sentido de que afirman un orden específico de eventos.

Creer que la “leyenda urbana” ha llevado a muchos novatos (y profesionales) por mal camino, a saber, el flujo interminable de preguntas sobre el comportamiento indefinido en las expresiones.

Entonces.

Para el operador de prefijo de C++ incorporado,

++x

incrementos x y produce (como resultado de la expresión) x como un valor l, mientras que

x++

incrementos x y produce (como resultado de la expresión) el valor original de x.

En particular, para x++ no hay no hay tiempo para ordenar implícita para el incremento y la producción del valor original de x. El compilador es libre de emitir código de máquina que produce el valor original de xpor ejemplo, podría estar presente en algún registro, y eso retrasa el incremento hasta el final de la expresión (siguiente punto de secuencia).

Las personas que creen incorrectamente que el incremento debe ser lo primero, y son muchas, a menudo concluyen que ciertas expresiones deben tener un efecto bien definido, cuando en realidad tienen un comportamiento indefinido.

  • @Sa’me Smd: “lvalue” es esencialmente una referencia a un objeto que tiene almacenamiento. su terminología proviene de principios de C, donde una tarea necesitaba un valor l en el izquierda lado.

    – Saludos y hth. – alf

    15 de diciembre de 2010 a las 1:35

  • Tienes razón en lo de la mecánica pero creo que te equivocas al decir otros e incorrectos a nivel conceptual. Los mecanismos son solo aspectos prácticos de tratar de implementar el concepto. ‘Correo’ medio después – conceptualmente, el incremento está hecho después. Todo el concepto de ‘secuencia’ como en ‘punto de secuencia’ implica un orden, y el UB proviene de una mala interpretación de cómo funcionan los puntos de secuencia, no de una ‘mala interpretación’ del significado de ‘pre’ y ‘post’.

    – sje397

    15 de diciembre de 2010 a las 1:48

  • Entonces, ¿cómo sería una expresión (i++ > 0) && someProperty(myArray[i]) ¿hacer? Me gusta si i = 5, ¿estaría llamando? someProperty con myArray[5] o myArray[6]?

    – AJMansfield

    12 de noviembre de 2012 a las 1:39


  • @AJMansfield: En términos de C++03, el && introduce un punto de secuencia (C++03 §1.9/18). En términos de C++11, la expresión del operando de la mano izquierda del && se secuencia antes de la expresión del operando de la derecha (C++11 §5.14/2). Esto quiere decir que si se hace la llamada, se hace con i valor 6.

    – Saludos y hth. – alf

    12 de noviembre de 2012 a las 4:09


  • @AJMansfield: El && y || son únicos en proporcionar evaluación de cortocircuito (y, por lo tanto, puntos de secuencia). El operador de elección ternario es un poco así, ya que garantiza que la elección no tomada no se evalúa. Pero para los operadores aritméticos, obtienes un Comportamiento indefinido cuando modificas y usas una variable en la misma expresión. Creo, pero no estoy seguro, que esto también es así para todos los demás operadores. De todos modos, es la mejor suposición, y no es bueno escribir código que se base en algún caso especial sutil que pocos o ningún programador conocen. 😉

    – Saludos y hth. – alf

    13 de noviembre de 2012 a las 0:09

int i, x;

i = 2;
x = ++i;
// now i = 3, x = 3

i = 2;
x = i++; 
// now i = 3, x = 2

‘Publicar’ significa después, es decir, el incremento se realiza después de leer la variable. ‘Pre’ significa antes, por lo que el valor de la variable se incrementa primero y luego se usa en la expresión.

  • “el incremento se realiza después de leer la variable”. Solía ​​pensar que entendía el incremento de post y prefijo, pero ahora tienes me ¡confundido!

    – Guillermo Tell

    15 de diciembre de 2010 a las 0:52

  • ¿Por qué es confuso? Estamos hablando de la concepto de incremento ‘pre’ y ‘post’. Esos prefijos significan antes de y después.

    – sje397

    15 de diciembre de 2010 a las 1:48

  • El “pre” y “post” en “preincremento” y “postincremento” se refieren a la posición del operador con respecto al operando. No implican ningún ordenamiento temporal entre cuando ocurre el incremento con respecto a cuando se lee la variable.

    –James McNellis

    20 de diciembre de 2010 a las 15:16

  • @James: entiendo su punto, pero para ilustrar, imagine lo confuso que sería si la función de los operadores se invirtiera. Sé que, técnicamente, no hay ninguna implicación de ordenamiento temporal, pero definitivamente hay un mapeo conceptual del incremento de publicaciones a la idea de ‘incrementar después utilizar’.

    – sje397

    20 de diciembre de 2010 a las 23:47

  • @sje397 por qué, por ejemplo, int a = 5; cout << a++; imprime solo 5 en lugar de 6 según su ejemplo?

    – RaHuL

    11 de febrero de 2020 a las 13:17

La diferencia entre el sufijo incremento, x++y el prefijo incremento, ++xestá precisamente en cómo los dos operadores evalúan sus operandos. El incremento de postfijo conceptualmente copia el operando en la memoria, incrementa el operando original y finalmente produce el valor de la copia. Creo que esto se ilustra mejor implementando el operador en el código:

int operator ++ (int& n)  // postfix increment
{
    int tmp = n;
    n = n + 1;
    return tmp;
}

El código anterior no se compilará porque no puede volver a definir operadores para tipos primitivos. El compilador tampoco puede decir aquí que estamos definiendo un sufijo operador en lugar de prefijo, pero supongamos que esto es C++ correcto y válido. Puede ver que el operador posfijo de hecho actúa sobre su operando, pero devuelve el valor anterior antes del incremento, por lo que el resultado de la expresión x++ es el valor antes del incremento. xsin embargo, es incrementado

El incremento de prefijo también incrementa su operando, pero produce el valor del operando después el incremento:

int& operator ++ (int& n)
{
    n = n + 1;
    return n;
}

Esto significa que la expresión ++x evalúa el valor de x después el incremento

Es fácil pensar que la expresión ++x es por lo tanto equivalente a la asignación (x=x+1). Sin embargo, esto no es precisamente así, porque un incremento es una operación que puede significar diferentes cosas en diferentes contextos. En el caso de un entero primitivo simple, de hecho ++x es sustituible por (x=x+1). Pero en el caso de un tipo de clase, como un iterador de una lista enlazada, un incremento de prefijo del iterador definitivamente no significa “agregar uno al objeto”.

¿Concepto de post incremento y pre incremento
matthewbruens

Nadie ha respondido a la pregunta:
¿Por qué este concepto es confuso?

Como estudiante de licenciatura en Ciencias de la Computación, me tomó un tiempo entender esto debido a la forma en que leo el código.

¡Lo siguiente no es correcto!


x = y++

X es igual a y correo incremento. Lo que lógicamente parecería significar que X es igual al valor de Y después la operación de incremento está hecha. Correo sentido después.

o

x = ++ y
X es igual a y pre-incremento. Lo que lógicamente parecería significar que X es igual al valor de Y antes de la operación de incremento está hecha. Pre sentido antes de.


La forma en que funciona es en realidad lo contrario. Este concepto es confuso porque el lenguaje es engañoso. En este caso no podemos usar las palabras para definir el comportamiento.
x=++y en realidad se lee como X es igual al valor de Y después el incremento
x=y++ en realidad se lee como X es igual al valor de Y antes de el incremento

Las palabras pre y post son al revés con respecto a la semántica del inglés. Solo significan dónde está el ++ en relación con Y. Nada más.

Personalmente, si tuviera la opción, cambiaría los significados de ++y e y++. Este es solo un ejemplo de un modismo que tuve que aprender.

Si hay un método para esta locura, me gustaría saberlo en términos simples.

Gracias por leer.

Es bastante simple. Ambos incrementarán el valor de una variable. Las siguientes dos líneas son iguales:

x++;
++x;

La diferencia es si está utilizando el valor de una variable que se incrementa:

x = y++;
x = ++y;

Aquí, ambas líneas incrementan el valor de y en uno. Sin embargo, el primero asigna el valor de y antes del incremento a x, y el segundo asigna el valor de y después del incremento a x.

Entonces, solo hay una diferencia cuando el incremento también se usa como una expresión. El incremento posterior se incrementa después de devolver el valor. El pre-incremento se incrementa antes.

  • Las dos líneas no son iguales en absoluto. -1

    – Guillermo Tell

    15 de diciembre de 2010 a las 0:51

  • wilhemtell: Gracias por no agregar absolutamente nada a la discusión. Buen trabajo.

    –Jonathan Wood

    15 de diciembre de 2010 a las 0:55

  • @JonathanWood ¿cuál es el tipo de x? Ahí tienes. Las dos líneas no son iguales. ¿Agrego algo a la discusión ahora?

    – Guillermo Tell

    15 de diciembre de 2010 a las 1:22

  • @JamesMcNellis nolas dos primeras declaraciones tienen el mismo efecto a menos que x es de tipo clase período.

    – Guillermo Tell

    15 de diciembre de 2010 a las 1:35

  • @wilhelmtell: si las sobrecargas son consistentes (que deberían ser), entonces el efecto de las declaraciones x++; y ++x; es el mismo. Sí, llamas a diferentes funciones, pero deberían hacer lo mismo. Eso es a lo que estaba tratando de llegar.

    –James McNellis

    15 de diciembre de 2010 a las 1:47

1647534372 438 ¿Concepto de post incremento y pre incremento
set

int i = 1;
int j = 1;

int k = i++; // post increment
int l = ++j; // pre increment

std::cout << k; // prints 1
std::cout << l; // prints 2

El incremento posterior implica el valor i se incrementa después de haber sido asignado a k. Sin embargo, pre incremento implica que el valor j se incrementa antes de que se asigne a l.

Lo mismo se aplica para el decremento.

  • Las dos líneas no son iguales en absoluto. -1

    – Guillermo Tell

    15 de diciembre de 2010 a las 0:51

  • wilhemtell: Gracias por no agregar absolutamente nada a la discusión. Buen trabajo.

    –Jonathan Wood

    15 de diciembre de 2010 a las 0:55

  • @JonathanWood ¿cuál es el tipo de x? Ahí tienes. Las dos líneas no son iguales. ¿Agrego algo a la discusión ahora?

    – Guillermo Tell

    15 de diciembre de 2010 a las 1:22

  • @JamesMcNellis nolas dos primeras declaraciones tienen el mismo efecto a menos que x es de tipo clase período.

    – Guillermo Tell

    15 de diciembre de 2010 a las 1:35

  • @wilhelmtell: si las sobrecargas son consistentes (que deberían ser), entonces el efecto de las declaraciones x++; y ++x; es el mismo. Sí, llamas a diferentes funciones, pero deberían hacer lo mismo. Eso es a lo que estaba tratando de llegar.

    –James McNellis

    15 de diciembre de 2010 a las 1:47

1647534373 475 ¿Concepto de post incremento y pre incremento
suri

Post-incremento:

int x, y, z;

x = 1;
y = x++; //this means: y is assigned the x value first, then increase the value of x by 1. Thus y is 1;
z = x; //the value of x in this line and the rest is 2 because it was increased by 1 in the above line. Thus z is 2.

Pre-incremento:

int x, y, z;

x = 1;
y = ++x; //this means: increase the value of x by 1 first, then assign the value of x to y. The value of x in this line and the rest is 2. Thus y is 2.
z = x; //the value of x in this line is 2 as stated above. Thus z is 2.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad