Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/12/2007, 09:14
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 7 meses
Puntos: 45
Concatenar asignaciones x*=x*=x*=x

Hola por aquí.

¿Alguien ha utilizado esta estructura alguna vez para hacer una potencia de x?
Código PHP:
var 2;
// 2^5
x*=x*=x*=x*=x;
alert(x); 
Lo cierto es que me la acabo de escribir para probar y funciona sin ningún problema, alerta 32.

Bueno, el problema no es ese, que el resultado es predecible. La cosa viene cuando metemos dos variables en ese tipo de sentencia. Me gustaría que probaseis este código:
Código PHP:
// escribir en el documento una ristra (x)html fuera de tiempo de ejecución.
function e(q,sinBR) {
    var 
elDIV document.createElement("DIV");
    if(
q==undefinedq="";
    if(!
sinBRq+="<br/>";
    
elDIV.innerHTML q;
    for(var 
a=0elDIV.childNodes.length>aa++) {
        
document.body.appendChildelDIV.childNodes[a].cloneNode(true) );
    }
}

var 
2;
var 
5;
e("var x = "x);
e("var y = "y);

x*=x*=y*=x*=x;
e("var x = "+" que es 2*2*5*2*2");
e("var y = "+" que es 5*2*2" ); 
Cita:
Iniciado por output
var x = 2
var y = 4
var x = 80 que es 2*2*5*2*2
var y = 20 que es 5*2*2
Esto es un lío . ¿Qué se ejecuta antes y qué después? Si empezamos poco a poco habría que comenzar de derecha a izquierda, porque si lo hacemos al revés nos pasará ésto:
x*=x*=y*=x*=x;
x(=2) lo multiplicamos por x(=2), pero ésta última x no es 2, es 5*2*2. Pero ese 5 no es 5 porque está multiplicado por 2*2..... bueno, un lío.

Lo que yo hago es multiplicar desde el final, dividiendo las sentencias (seguid el código de colores):
x*=x*=y*=x*=x;
He deducido que los valores originales no cambian durante la sentencia. Es decir, x siempre se sustituye por 2 e y siempre se sustituye por 5 (aunque tal vez me equivoque). La más fácil de entender es la y. Cogemos la parte final de la sentencia y tenemos que y*=(x*x) (y = 5*2*2 = 20). Ningún problema aparentemente.
Ahora vamos por la x:
x = x * 2; // vamos x=4
x = x * 5; // vamos x=20
x = x * 2; // vamos x=40

Si lo hemos hecho bien -creo que sí- nos hemos quedado al final con que x=40, y lo que nos imprime es x=80.







La pregunta es: ¿Qué procedimiento sigue el motor de javascript para decirnos que x=80? ¿Como se puede desglosar esa sentencia x*=x*=y*=x*=x en sentencias más simples como he intentado yo?


Cada día me sorprende más este lenguaje
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.