What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.

Iniciado por erest0r, 19 Marzo 2014, 23:49 PM

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

erest0r

En este link http://www.stroustrup.com/bs_faq2.html exactamente como es el titulo del post, él explica que este ejemplo:

v[ i ] = i++;

Deberia evitarse ( segun lei ) porque el resultado es indefinido. Por como tengo entendido, como el operador esta en post-incremento, él asignaria el valor de "i" a la variable y luego se incrementa el valor de "i", ¿ O fue que entendi mal lo que quiso explicar el señor Stroustrup?


Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

engel lex

#1
me parece absurdo que sea indefinido, porque instrucción es bien clara

el dice
CitarIt's undefined. Basically, in C and C++, if you read a variable twice in an expression where you also write it, the result is undefined. Don't do that. Another example is:
   v = i++;
Related example:
   f(v,i++);
Here, the result is undefined because the order of evaluation of function arguments are undefined.
Having the order of evaluation undefined is claimed to yield better performing code. Compilers could warn about such examples, which are typically subtle bugs (or potential subtle bugs). I'm disappointed that after decades, most compilers still don't warn, leaving that job to specialized, separate, and underused tool



y se a que se refiere... aunque creo que lo explica o redacta mal...

recuerdo que los compiladores cuando en por ejemplo un if descubren que la condicion no se puede cumplir se detienen....


entonces...


Código (cpp) [Seleccionar]
int c =0;

if(true && c++){

}


en este caso c = 1 al finalizar el programa... pero si sucede esto

Código (cpp) [Seleccionar]
int c =0;
if(false && c++){

}


en este caso c = 0

esto se puede tomar como indefinición o comportamiento inesperado ya que el hecho que c aumente no es seguro
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.

erest0r

#2
Mmmmm a mi si me extrañó eso, a lo mejor si fue que falto explicar mejor ese punto.

EDIT: Se te paso por alto algo en la cita que hiciste, colocaste v = i++;
y es v[ i ] = i++;




Informacion propia del señor Stroustrup ( si, le envie un correo con la duda que acabo de proponer aqui )

Yo:

" Hello Mr. Stroupstrup , mi name is Alver Lopez, well i noticed in the section

What's the value of i++ + i++? at http://www.stroustrup.com/bs_faq2.html#evaluation-order  where you say v[ i ] = i++; would have a undefined result, i though as a post-increment operator, the actual value of "i" would be asigned to v, then increase the value of "i", or maybe you forgot to point out something else?

Thank you."

Sr. Strouptous:

" No. It's undefined. The left-hand side may be evaluated before the right-hand side (yielding a pointer to where the result of the right-hand side is to be stored). This is not a rule I would have invented. "

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

engel lex

probé lo siguiente

Código (cpp) [Seleccionar]
int i =0;
    int v[6]={0,0,0,0,0,0};
    v[i]=i++;
    v[i++]=i++;
    v[i++]=i++;
    v[i++]=i;
    v[i]=i++;


resultado esperado...
i = 0;
v=i++ esperado v[0]=0, i+1
v[i++]=i++ esperado v[1]=2, i+1
v[i++]=i++ esperado v[3]=4, i+1
v[i++]=i esperado v[5]=6
v=i++ esperado v[6]=6, i+1
al final se esperaba i = 7


resultado del codigo...
0, 1, 0, 3 ,0, 5


como que si es medio erratico o yo estoy calculando mal
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.

erest0r

En realidad si me parece raro ese resultado, es decir ¿ Cómo es que después de un numero distinto a 0, vuelve a aparecer ? xD no logro ver el orden como deberia evaluarse cada sentencia.
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

engel lex

fíjate que me salto la posición 2 y 4 del array, esos 0 si van ahí pero los otros números nos XD
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.

rir3760

Una expresión como esta:
a[i] = i++;
Tiene un resultado indefinido, explicando por partes:

1) Los puntos de secuencia. Salvo los operadores '&&', '||', ',' y '?:' el siguiente punto de secuencia se indica por el terminador de sentencia ';'. Un ejemplo:
alguna_expresion (1); /* (1)  marca el siguiente punto de secuencia */

2) Todo efecto lateral (por ejemplo el generado por los operadores unarios ++ y --) se aplicara en algún momento antes del siguiente punto de secuencia.

3) Dada la mentada expresión:
a[i] = i++;
(1)  (2)

Y considerando lo anterior esta puede ser evaluada en cualquiera de las siguientes formas:

* La expresión (2) se evalúa primero, a continuación aplica el efecto lateral y por ultimo se evalúa (1).
* La expresión (2) se evalúa primero, a continuación se evalúa (1) y por ultimo aplica el efecto lateral.
* La expresión (1) se evalúa primero, a continuación se evalúa (2) y por ultimo aplica el efecto lateral.

Cualquiera que suceda es valida (y por ello la recomendación de evitar expresiones cuyo resultado es indefinido).

----

Otra historia son expresiones del tipo:
i = i++;
Estas son ilegales ya que se modifica un objeto (en este caso la variable "i") en mas de una ocasión entre puntos de secuencia (la asignación mas el efecto lateral).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

erest0r

Gracias por la explicación rir3760, al menos ya es algo de lo que estaré consciente de ahora en adelante jejeje
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.