Operadores aritméticos encadenados

Started by Windgate, April 23, 2010, 02:56:54 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

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?
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

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
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

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.

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

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;
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/