Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: G+10 en 07 de Agosto de 2008, 06:29:27 PM

Título: Operadores de incremento y decremento
Publicado por: G+10 en 07 de Agosto de 2008, 06:29:27 PM
bueno en el manual que estoy leyendo dice que hay operadores de incremento ++ y decremento --
Y que hay postifijos y prefijos, y que los postifijos incrementan después de que su valor se de y prefijos antes, alguien me da un ejemplo que no le entendí bien.
Título: Operadores de incremento y decremento
Publicado por: davirro en 07 de Agosto de 2008, 06:43:02 PM
http://www.norte.uni.edu.ni/estudiantes/manualc.pdf
Título: Operadores de incremento y decremento
Publicado por: StraT en 07 de Agosto de 2008, 06:58:22 PM
Bueno, pues mira:

int a = 0, b = 1;

a++ // a = 1;
++a // a = 1;
a = b++;  //a = 1 y b = 2 -> Post incremento
a = ++b; //a = 2 y b = 2 -> Pre incremento

Y es igual pero al revés con el --.
Título: Operadores de incremento y decremento
Publicado por: G+10 en 07 de Agosto de 2008, 07:01:48 PM
Cita de: StraTBueno, pues mira:

int a = 0, b = 1;

a++ // a = 1;
++a // a = 1;
a = b++;  //a = 1 y b = 2 -> Post incremento
a = ++b; //a = 2 y b = 2 -> Pre incremento

Y es igual pero al revés con el --.

gracias muy claro el ejemplo
Título: Operadores de incremento y decremento
Publicado por: alberizo en 07 de Agosto de 2008, 10:53:24 PM
Ya puestos en el tema, según he leido en algunos sitios, si por ejemplo se quiere incrementar 1 a una variable, este sería el orden de eficacia y rendimiento

++a < a = a+1 < a++

¿Alguien puede confirmarlo?
Título: Operadores de incremento y decremento
Publicado por: Capiflash en 07 de Agosto de 2008, 11:20:43 PM
Pues me gustaria que alguien explicase por qué ++a rinde mejor que a++. Según lo veo yo son la misma operación , sólo se diferencian en cuando se aplican , o me estoy equivocando demasiado?
Título: Operadores de incremento y decremento
Publicado por: ethernet en 07 de Agosto de 2008, 11:25:05 PM
Cita de: CapiflashPues me gustaria que alguien explicase por qué ++a rinde mejor que a++. Según lo veo yo son la misma operación , sólo se diferencian en cuando se aplican , o me estoy equivocando demasiado?

coge stl y te miras un iterator, verás que para el it++ necesita crear un temporal y para ++it no.
Título: Operadores de incremento y decremento
Publicado por: davur en 07 de Agosto de 2008, 11:36:35 PM
Foo operator++(Foo& foo, int) // Postincremento
{
  Foo temp = foo;
  ++foo;
  return temp;
}

Foo& operator++(Foo& foo) // Preincremento
{
  ++foo.bar;
  return foo;
}


Dependiendo de la complejidad de Foo (construcción no trivial, semántica de copia), puede no ser posible optimizar la llamada al constructor copia en el operador de postincremento (caso habitual: iteradores de la librería estándar).

Moraleja: a no ser que realmente necesites el valor devuelto por el operador de postincremento, utiliza siempre el operador de preincremento (porque nunca es menos eficiente).
Título: Operadores de incremento y decremento
Publicado por: StraT en 08 de Agosto de 2008, 12:00:04 AM
Sí, davur tiene razón, de hecho para comprobarlo vosotros mismos podéis probar a sobrecargar los operadores de pre y postincremento de cualquier clase que tengáis, y comprobad que el código que os sale en uno tiene una variable temporal y el otro no.

Saludos
Título: Operadores de incremento y decremento
Publicado por: Capiflash en 08 de Agosto de 2008, 12:53:18 AM
Vaya , pues no me habia parado a pensar nunca en eso , todos los dias se aprende algo nuevo :)

Gracias! :P
Título: Operadores de incremento y decremento
Publicado por: davur en 08 de Agosto de 2008, 06:39:22 PM
Técnicamente, el problema es el mismo tanto para tipos predefinidos como para tipos definidos por el usuario. En la práctica, al compilador le resultará bastante más sencillo optimizar en el caso de un tipo predefinido. Pero es que también podrá optimizar, generalmente, en el caso de un tipo definido por el usuario (existe la salvedad de tipos con características como las que comentábamos anteriormente).

Personalmente, y por consistencia, siempre que es posible utilizo el operador de preincremento. De esta manera, no hay debate.
Título: Operadores de incremento y decremento
Publicado por: 16BITBoy en 09 de Agosto de 2008, 01:15:14 AM
interesante cuestión, ya lei algo antes acerca de eso, aunque, tiene que ser bien complejo y lento algoritmo para tener que recurrir a esto ¿no? o tanto se nota la rapidez en la ejecucion :S
Título: Operadores de incremento y decremento
Publicado por: StraT en 09 de Agosto de 2008, 02:04:58 AM
Citartiene que ser bien complejo y lento algoritmo para tener que recurrir a esto ¿no? o tanto se nota la rapidez en la ejecucion :S

No, realmente no se nota tanto, pero si te acostumbras a hacerlo, que no cuesta nada, estás siguiendo buenas prácticas. También debes tener en cuenta dónde se usan los incrementos, por ejemplo en bucles. En un bucle de 20 iteraciones no se nota, pero imagina un bucle de un millón de iteraciones, o de cien millones. Estás creando cien millones de variables temporales.

Un saludo, ;)