Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Windgate on April 23, 2010, 02:56:54 PM

Title: Operadores aritméticos encadenados
Post by: Windgate on April 23, 2010, 02:56:54 PM
El otro día me surgió una duda frente a un error de ejecución, es una pena no haber conservado el código, pero os explico porque es muy breve:

IF ( 1 < x < 100 )
   say ( "Primer intervalo" );
ELSEIF ( 101 < x < 200 )
   say ( "Segundo intervalo" );
ELSEIF ( 201 < x < 300 )
   say ( "Último intervalo" );
END


Este tipo de comprobaciones aritméticas compilan, pero la ejecución no es correcta, tuve que terminar haciendo:

IF ( ( 1 < x ) AND ( x < 100 ) )
   ...etc


También había usado varias veces este tipo de asignaciones encadenadas en estructuras sin problemas:

scale.x = scale.y = scale.z = 2;

Pero el otro día por primera vez tuve un comportamiento extraño en el que sólo uno de los campos fue asignado y terminé haciendo:

scale.x = 2;
scale.y = 2;
scale.z = 2;


¿Alguien es capaz de aclararnos algo sobre el encadenamiento de operaciones, sobre lo que se puede y lo que no se puede hacer?
Title: Re: Operadores aritméticos encadenados
Post by: SplinterGU on April 23, 2010, 04:34:22 PM
esto ( 1 < x < 100 ) es lo mismo que poner ( 1 < x ) < 100

esto ( 101 < x < 200 ) es lo mismo que poner ( 101 < x ) < 200

lo mismo para todo lo demas... te sugiero leas el post de precedencia de operadores...

saludos.
Title: Re: Operadores aritméticos encadenados
Post by: Windgate on April 24, 2010, 12:58:33 PM
La precedencia... Ya entiendo.

Está todo aclarado, pero he posteado esto en sugerencias porque creo recordar que ese tipo de encadenamientos en operadores aritméticos están soportados en lenguajes como C o Java, desconozco si basta con modificar la precedencia de operadores o si sería más complicado que eso y supondría efectos colaterales...

Vamos, se trata de esas sugerencias que han ido saliendo para la 2.0 de Bennu, por si la quieres tener en cuenta xD
Title: Re: Operadores aritméticos encadenados
Post by: DCelso on April 24, 2010, 01:38:57 PM
Que va, ni c ni java tienen implementado ese tipo de condicional, funcionan exactamente igual que Bennu, por precedencia.
Es decir si equis es mayor que 10 y menor que 20 solo se puede comprobar con if ((x>10) and (x<20)) y no vake if (10<x<20), como propones, ya que equivale a decir si (10 es menor que equis) que devuelve true o false , es decir 1 o 0, y luego comparar ese resultado de 1 o 0 con menor que 20, y como (1 y 0 ) siempre serán mayor que 20 el segundo condicional no serviría para nada en este caso.

Quizás te refieras a otros lenguajes de más alto nivel como lua, o mathematica, o algún otro más cercano a la forma de pensar matemática, pero no te lo puedo confirmar.

Title: Re: Operadores aritméticos encadenados
Post by: SplinterGU on April 24, 2010, 03:20:38 PM
ni C ni java...

en bennu podes hacer algo parecido con los switch...

switch(x)
      case 1 .. 100:
      end
      case 101 .. 200:
      end
      case 201 .. 300:
      end
end
Title: Re: Operadores aritméticos encadenados
Post by: Windgate on April 24, 2010, 06:10:29 PM
Vale, os creo... Entonces sería Ada, un lenguaje mogollón de estructurado, fuertemente tipado y con muchas hostias interesantes que estudiamos intensivamente en la Universidad para luego olvidarlo para siempre.

Ok entonces, pero lo sigo dejando como sugerencia para Bennu 2.0 porque resulta muy cómodo escribir ese tipo de expresiones así.

¿Sobre la asignación encadenada también es algo que no funciona en cualquier lenguaje?

scale.x = scale.y = scale.z = 2;
Title: Re: Operadores aritméticos encadenados
Post by: DCelso on April 24, 2010, 07:33:57 PM
pues en JAVA no y en C sí.