Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 19 Marzo 2014, 23:49 pm



Título: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: erest0r en 19 Marzo 2014, 23:49 pm
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?
 



Título: Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: engel lex en 20 Marzo 2014, 00:36 am
me parece absurdo que sea indefinido, porque instrucción es bien clara

el dice
Citar
It'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
  1. int c =0;
  2.  
  3. if(true && c++){
  4.  
  5. }
  6.  

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

Código
  1. int c =0;
  2. if(false && c++){
  3.  
  4. }
  5.  

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


Título: Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: erest0r en 20 Marzo 2014, 00:53 am
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. "



Título: Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: engel lex en 20 Marzo 2014, 02:04 am
probé lo siguiente

Código
  1. int i =0;
  2.    int v[6]={0,0,0,0,0,0};
  3.    v[i]=i++;
  4.    v[i++]=i++;
  5.    v[i++]=i++;
  6.    v[i++]=i;
  7.    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


Título: Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: erest0r en 20 Marzo 2014, 02:35 am
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.


Título: Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: engel lex en 20 Marzo 2014, 02:40 am
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


Título: Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: rir3760 en 20 Marzo 2014, 02:51 am
Una expresión como esta:
Código
  1. 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:
Código
  1. 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:
Código
  1. a[i] = i++;
  2. (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:
Código
  1. 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


Título: Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q.
Publicado por: erest0r en 20 Marzo 2014, 03:31 am
Gracias por la explicación rir3760, al menos ya es algo de lo que estaré consciente de ahora en adelante jejeje