que preincremento postincremento operadores operador incremento entre ejemplos diferencia despues decremento antes c++ conceptual post-increment pre-increment

c++ - operadores - preincremento y postincremento c



¿Concepto post-incremento y pre-incremento? (9)

Desde el estándar C99 (C ++ debe ser el mismo, salvo que se produzca una sobrecarga extraña)

6.5.2.4 Operadores de incremento e incremento de Postfix

Restricciones

1 El operando del operador de incremento o disminución de sufijo debe tener un tipo real o puntero calificado o no calificado y debe ser un valor l modificable.

Semántica

2 El resultado del operador postfix ++ es el valor del operando. Después de obtener el resultado, el valor del operando se incrementa. (Es decir, se le agrega el valor 1 del tipo apropiado). Consulte las discusiones sobre los operadores aditivos y la asignación compuesta para obtener información sobre restricciones, tipos y conversiones y los efectos de las operaciones en los punteros. El efecto secundario de actualizar el valor almacenado del operando se producirá entre el punto de secuencia anterior y el siguiente.

3 El operador posfijo es análogo al operador postfix ++, excepto que el valor del operando se reduce (es decir, se resta el valor 1 del tipo apropiado).

6.5.3.1 Operadores de incremento e incremento de prefijo

Restricciones

1 El operando del operador de incremento o disminución del prefijo debe tener un tipo real o puntero calificado o no calificado y debe ser un valor l modificable.

Semántica

2 El valor del operando del operador de prefijo ++ se incrementa. El resultado es el nuevo valor del operando después del incremento. La expresión ++ E es equivalente a (E + = 1). Consulte las discusiones sobre los operadores aditivos y la asignación de compuestos para obtener información sobre restricciones, tipos, efectos secundarios y conversiones y los efectos de las operaciones en los punteros.

3 El operador de prefijo es análogo al operador de prefijo ++, excepto que el valor del operando se reduce.

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


El incremento previo es anterior al valor de incremento ++ por ejemplo:

(++v) or 1 + v

El incremento posterior es después de incrementar el valor ++ por ejemplo:

(rmv++) or rmv + 1

Programa:

int rmv = 10, vivek = 10; cout << "rmv++ = " << rmv++ << endl; // the value is 10 cout << "++vivek = " << ++vivek; // the value is 11


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. Los incrementos posteriores al incremento después de devolver el valor. El incremento previo aumenta antes.


La diferencia entre el incremento de posfijo , x++ y el incremento de prefijo , ++x , es precisamente en la forma en que los dos operadores evalúan sus operandos. El incremento de postfijo copia conceptualmente el operando en la memoria, incrementa el operando original y finalmente arroja 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 redefinir operadores para tipos primitivos. El compilador tampoco puede decir aquí que estamos definiendo un operador de postfijo en lugar de un prefijo , pero pretendemos que es correcto y válido en C ++. Puede ver que el operador postfix actúa en su operando, pero devuelve el valor anterior antes del incremento, por lo que el resultado de la expresión x++ es el valor anterior al incremento. x , sin embargo, se incrementa.

El incremento de prefijo también incrementa su operando, pero arroja el valor del operando después del 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 del incremento.

Es fácil pensar que la expresión ++x es por lo tanto equivalente a la asignación (x=x+1) . Esto no es precisamente así, sin embargo, porque un incremento es una operación que puede significar cosas diferentes en contextos diferentes. 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".


Las cuatro respuestas hasta ahora son incorrectas , ya 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, la interminable corriente de preguntas sobre el Comportamiento Indefinido en las expresiones.

Asi que.

Para el operador de prefijo de C ++ incorporado,

++x

incrementa x y produce como expresión resultado x como lvalue, mientras

x++

incrementa x y produce como expresión el resultado del valor original de x .

En particular, para x++ no hay orden de tiempo implícito 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 x , por 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 que son muchas, a menudo concluyen que ciertas expresiones deben tener un efecto bien definido, cuando en realidad tienen un Comportamiento no definido.


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

Como estudiante de informática, 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 un incremento de poste . Lo que lógicamente parece significar que X es igual al valor de Y después de que se realiza la operación de incremento. Publicar significado después .

o

x = ++ y
X es igual a y preincremento. Lo que lógicamente parece significar que X es igual al valor de Y antes de que se realice la operación de incremento. Pre significado antes

La forma en que funciona es realmente 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 se lee realmente cuando X es igual al valor de Y después del incremento.
x = y ++ se lee realmente cuando X es igual al valor de Y antes del incremento.

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

Personalmente, si tuviera la opción cambiaría los significados de ++ yy ++. Este es solo un ejemplo de una expresión idiomática que tuve que aprender.

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

Gracias por leer.


También debe tener en cuenta que el comportamiento de los operadores postincremento / decremento es diferente en C / C ++ y Java.

Dado

int a=1;

en C / C ++ la expresión

a++ + a++ + a++

evalúa a 3, mientras que en Java evalúa a 6. Adivina por qué ...

Este ejemplo es aún más confuso:

cout << a++ + a++ + a++ << "<->" << a++ + a++ ;

imprime 9 <-> 2 !! Esto se debe a que la expresión anterior es equivalente a:

operator<<( operator<<( operator<<( cout, a++ + a++ ), "<->" ), a++ + a++ + a++ )


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

Incremento de publicación implica que el valor i se incrementa después de haber sido asignado a k . Sin embargo, el incremento previo implica que el valor j se incrementa antes de asignarse a l .

Lo mismo aplica para decremento.


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 que se lee la variable. ''Pre'' significa antes, por lo que el valor de la variable se incrementa primero, luego se usa en la expresión.