Título: Salida inesperada de este programa Publicado por: SebaC en 23 Mayo 2016, 23:58 pm Tengo este sencillo programa
Código
En el cual inicializo un array de enteros pero cuando imprimo el contenido me da números extraños que no corresponden a la variable i Que pasa aquí? Título: Re: Salida inesperada de este programa Publicado por: AlbertoBSD en 24 Mayo 2016, 00:07 am Código Estas asignado e incrementando i y despues imprimes el i no inicializado. Tienes que incrementar en el printf o despues Título: Re: Salida inesperada de este programa Publicado por: SebaC en 24 Mayo 2016, 01:42 am y despues imprimes el i no inicializado. Yo inicialice i a cero no entiendo porque dices eso Título: Re: Salida inesperada de este programa Publicado por: AlbertoBSD en 24 Mayo 2016, 01:52 am el i++ lo tienes dentro de los corchetes
i vale 0 asignas 0 a arr[0] incrementas i y ahora vale 1 imprimes arr[1] asignas 1 a arr[1] incrementas i y ahora vale 2 .... Tu codigo tendria que estar asi Código
o bien Código
¿Vez la diferencia? Título: Re: Salida inesperada de este programa Publicado por: geeke en 24 Mayo 2016, 02:10 am Código
La variable i se está modificando en el lado derecho de la asignación y tambien se hace referencia a ella en la izquierda el estándar de C no permite esto porqué no hay punto de secuencia para mas info http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) Título: Re: Salida inesperada de este programa Publicado por: AlbertoBSD en 24 Mayo 2016, 02:54 am Yo estoy con que la asignacion es totalemente valida.
Con el codigo que el presento solo es necesario modificatr el printf esta es otra version valida. Código
Salida: Código: 1 Se le podria agregar Código Para ver cuando vale i al momento de imprimir el contenido del arreglo. O antes de la asignacion del valor. O ambos aun mejor XD Código
Salida: Código
Título: Re: Salida inesperada de este programa Publicado por: geeke en 24 Mayo 2016, 05:36 am Yo estoy con que la asignacion es totalemente valida. Con el codigo que el presento solo es necesario modificatr el printf esta es otra version valida. Te invito a leer la página que proporcioné mas arriba al parecer no tomaste tiempo en leerlo, esa asignación provoca comportamiento indefinido por lo tanto no existe garantía de que el resultado sea lo esperado. Compila ese código con el nivel de advertencia -Wall luego me cuentas Título: Re: Salida inesperada de este programa Publicado por: engel lex en 24 Mayo 2016, 05:54 am AlbertoBSD lo que dice JOWELL es cierto, los incrementos de ese tipo pueden generar comportamiento indefinido y diferentes compiladores pueden tomarlo en diferentes maneras
Código
Citar C++ does not define the order in which function arguments are evaluated. If the left argument is evaluated first, this becomes a call to add(5, 6), which equals 11. If the right argument is evaluated first, this becomes a call to add(6, 6), which equals 12! Note that this is only a problem because one of the argument to function add() has a side effect. Código
Citar What value does this program print? The answer is: it’s undefined. If the ++ is applied to x before the assignment, the answer will be 1. If the ++ is applied to x after the assignment, the answer will be 2. There are other cases where C++ does not specify the order in which certain things are evaluated, so different compilers will make different assumptions. Even when C++ does make it clear how things should be evaluated, some compilers implement behaviors involving variables with side-effects incorrectly. These problems can generally all be avoided by ensuring that any any variable that has a side-effect applied is used no more than once in a given statement. http://www.learncpp.com/cpp-tutorial/33-incrementdecrement-operators-and-side-effects/ (http://www.learncpp.com/cpp-tutorial/33-incrementdecrement-operators-and-side-effects/) Título: Re: Salida inesperada de este programa Publicado por: AlbertoBSD en 24 Mayo 2016, 14:10 pm Tienen razon, me dormi pensando en ese problema y me pregunte si estubiera compilando ese codigo que instruccion pondria primero y todas las formas llevan a un reaultado diferente.
Opciones: Seleccionar la direccion la direccion de memoria para guardar el valor, incrementar i y copiar el valor a la direccion previamemte seleccionada. Seleccionar la direccion de memoria, copiar el valor e incrementar i. incrementar i, seleccionar la direccion y copiar el valor. Copiar el valor a un registro interno, incrementar i y copiar el valor a la direccion de i actual. Copiar el valor a un registro interno, seleccionar la direccion de memoria, incrementar i En fin... Conclusión Colocar el incremento de i en una linea separada abajo del printf. O en el printf. Muy didactico el topic parece sencillo, aunque mis primeras respuesta no eran del todo correctas. Falta ver que responde Sosar a todo esto. Saludos. Título: Re: Salida inesperada de este programa Publicado por: SebaC en 24 Mayo 2016, 16:15 pm Ya decía yo que algo andaba mal en esa asignación, en síntesis aquí el orden de evaluación es indefinido ;-)
|