Problema con uso del incremento de una variable.

Iniciado por SDCC, 26 Abril 2018, 21:40 PM

0 Miembros y 1 Visitante están viendo este tema.

SDCC

Muy buenos dias,tardes o noches,durante un problema que realizaba sobre archivos me tope con un error un tanto extraño y que me hizo retomar este tema basico sobre el incremento en postfijo y prefijo.Tengo muy presentes las dos diferencias entre escribir el incremento en postfijo y prefijo pero a la hora de yo realizar varios postfijos o prefijos en una sentencia como la funcion printf() me topo con que los datos que arroja son algo raros y no termino de realizar una conexion entre los incrementos de la variable y los valores arrojados.

#include <stdio.h>
#include <stdlib.h>

int main()
{
   
int i=0;

printf("%d %d %d %d %d %d", ++i, i++, ++i, i++, ++i, i++);

}



El problema anterior no es el problema original, sin embargo es un pedazo de codigo que en esencia es el mismo problema que tengo en archivos y que ya pude solucionar de otra forma pero que sin embargo sigo sin entender la razon del resultado.

engel lex

el incremento prefijo y postfijo tienen su juego debido a su forma de funcionamiento... muchas veces pueden tomarse como "comportamiento indefinido"

la variable no necesariamente se evalúa de izquierda a derecha o de izquierda a derecha... esto no sigue un standard peculiar


un articulo en inglés sobre los puntos de secuencia, que es quien "define" esto
https://en.wikipedia.org/wiki/Sequence_point
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

SDCC

Muchas gracias por tu respuesta,ahora entiendo que es lo que ocurre.

JPS

Mmm, no me ha quedado muy claro..., soy nuevo.


/*
https://en.wikipedia.org/wiki/Sequence_point

Los puntos de secuencia también entran en juego cuando la misma variable se modifica más de una vez
en una sola expresión. Un ejemplo frecuentemente citado es la expresión C i=i++ , que aparentemente
le asigna a i su valor anterior e incrementa i . El valor final de i es ambiguo, ya que, dependiendo
del orden de evaluación de la expresión, el incremento puede ocurrir antes, después o intercalado con
la asignación. La definición de un idioma particular puede especificar uno de los comportamientos
posibles o simplemente decir que el comportamiento no está definido . En C y C ++, la evaluación de
dicha expresión produce un comportamiento indefinido. [4] Otros lenguajes, como C # , pueden definir
la precedencia de la asignación e incrementar el operador de tal forma que se garantice el resultado
de la expresión i=i++.
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{

/*Puntos de secuencia en diferentes expresiones*/
int i=0;
printf("  i   = %d\n",i);
printf("++i   = %d\n",++i);
printf("  i++ = %d\n",i++);
printf("++i   = %d\n",++i);
printf("  i++ = %d\n",i++);
printf("++i   = %d\n",++i);
printf("  i++ = %d\n",i++);
printf("++i   = %d\n",++i);
printf("  i++ = %d\n",i++);
printf("++i   = %d\n",++i);
printf("  i++ = %d\n",i++);
printf("  i   = %d\n\n",i);

printf("Reiniciamos i = 0\n\n");
i=0;

/*Puntos de secuencia en una misma expresion*/
printf("  i   = %d\n++i   = %d\n  i++ = %d\n++i   = %d\n  i++ = %d\n++i   = %d\n  i++ = %d\n++i   = %d\n  i++ = %d\n++i   = %d\n  i++ = %d\n  i   = %d\n\n",i,++i,i++,++i,i++,++i,i++,++i,i++,++i,i++,i);

return 0;
}


Resultados:


  i   = 0
++i   = 1
  i++ = 1
++i   = 3
  i++ = 3
++i   = 5
  i++ = 5
++i   = 7
  i++ = 7
++i   = 9
  i++ = 9
  i   = 10

Reiniciamos i = 0

  i   = 10
++i   = 10
  i++ = 8
++i   = 10
  i++ = 6
++i   = 10
  i++ = 4
++i   = 10
  i++ = 2
++i   = 10
  i++ = 0
  i   = 10


--------------------------------
Process exited after 0.02101 seconds with return value 0
Presione una tecla para continuar . . .


En la primera lista de números se ve un comportamiento esperado en los operadores de incremento.... ¿Porque están cada uno en una expresión (printf) única para cada uno; aunque todos hagan referencia a la misma variable?

En la segunda lista de números se observa un comportamiento inesperado y parece errático; pero sin embargo, se puede apreciar una progresión descendente: 10, 8, 6, 4, 2, 0. Frente a otra progresión permanente de 10.

En definitiva; aunque muestre una especie de patrón. ¿Hay que considerarlo errático y ambiguo? ya que todas las evaluaciones a la misma variable se efectuan en la misma expresión (printf) y... ¿es algo que se debe de evitar?


MAFUS

Has leído el artículo del link?

En él se explica porqué ocurre y en qué otros casos puede suceder.

Básicamente habla de los puntos de secuencia que son situaciones en la que C asegura que todos los cálculos previos están hechos. Si hay expresiones que dependen de unas de otras y no ha habido puntos de secuencia, puedes encontrar resultados aleatorios como en el ejemplo ya que, para hacer código más eficiente puede ejecutar esa serie de instrucciones en tiempos diferentes a los que has programado.

6666

#5
El operador sufijo/prefijo solo funcionan en variables. Para solucionar eso se usa la sobrecarga de operadores, deberías leer sobre el operador 'operator'

JPS

Gracias Mafus y 6666.

Si lo leí... en parte... pero no lo logré entender del todo, supongo que por la densidad de contenido. Tengo que dedicarle más tiempo y también le echaré un ojo a eso de sobrecarga de operadores para ampliar conocimientos.