Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Confirmación de orden de operadores

Estas en el tema de Confirmación de orden de operadores en el foro de PHP en Foros del Web. Saludos a todos Me estoy liando con el orden de los operadores y los OR y AND If (A || B && C) Si A ...
  #1 (permalink)  
Antiguo 02/12/2013, 10:11
 
Fecha de Ingreso: agosto-2004
Mensajes: 312
Antigüedad: 20 años, 3 meses
Puntos: 0
Confirmación de orden de operadores

Saludos a todos

Me estoy liando con el orden de los operadores y los OR y AND

If (A || B && C)
Si A es true y C es true retorna true
Si B es true y C es true retorna true
Pero sin A o B es true pero C es false retorna false

¿Eso es así?

Gracias por adelantado

La sentencia con la que me estoy liando es:
Código PHP:
Ver original
  1. if (!$order->hasBeenDelivered() || ($order->hasBeenDelivered() && Tools::isSubmit('reinjectQuantities')) && $order_detail_list[$id_order_detail]['quantity'] > 0)
  2.                             $this->reinjectQuantity($order_detail, $order_detail_list[$id_order_detail]['quantity']);
y quería confirmación de que si $order->hasBeenDelivered() me retorne false y $order_detail_list[$id_order_detail]['quantity'] sea mayor que 0 SI que se va a ejecutar la sentencia de la linea 2 ($this->reinjectQuantity($order_detail, $order_detail_list[$id_order_detail]['quantity']);)

Gracias por adelantado
  #2 (permalink)  
Antiguo 02/12/2013, 10:18
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 13 años, 2 meses
Puntos: 397
Respuesta: Confirmación de orden de operadores

Si lo colocas así te funciona?

Código PHP:
Ver original
  1. if ( (!$order->hasBeenDelivered() && $order_detail_list[$id_order_detail]['quantity'] > 0) || ($order->hasBeenDelivered() && Tools::isSubmit('reinjectQuantities')))

Edito:

Tomando en cuenta las consideraciones que das:

Cita:
Si A es true y C es true retorna true
Si B es true y C es true retorna true
Pero sin A o B es true pero C es false retorna false
C siempre debe ser true en las tres casos, pero A o B pueden ser true o false. Por ende:

($a || $b) && $c

!$order->hasBeenDelivered() -> A
($order->hasBeenDelivered() && Tools::isSubmit('reinjectQuantities')) -> B
$order_detail_list[$id_order_detail]['quantity'] > 0 -> C

Así que siguiendo la lógica sería:

Código PHP:
Ver original
  1. if ((!$order->hasBeenDelivered() || ($order->hasBeenDelivered() && Tools::isSubmit('reinjectQuantities'))) && $order_detail_list[$id_order_detail]['quantity'] > 0)

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.

Última edición por jonni09lo; 02/12/2013 a las 10:30
  #3 (permalink)  
Antiguo 02/12/2013, 10:52
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 10 meses
Puntos: 206
Respuesta: Confirmación de orden de operadores

Las operaciones booleanas SON EXACTAMENTE IGUALES a las operaciones matemáticas para saber qué peso tiene cada condición.

Grábate ésto en la cabeza:
El OR es la suma, un "+".
El AND es la multiplicación, un "x" ( ó *, si te gusta más).

Evidentemente, la multiplicación tiene más peso que la suma. 3+5*10 es 53. Jamás 80.

Así te será mas fácil saber el orden en el que se agrupan las condiciones booleanas.
Al igual que en las operaciones matemáticas, se pueden usar paréntesis que influyen en el orden de agrupamiento.

Última edición por marlanga; 02/12/2013 a las 10:59
  #4 (permalink)  
Antiguo 03/12/2013, 01:55
 
Fecha de Ingreso: agosto-2004
Mensajes: 312
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Confirmación de orden de operadores

Gracias a ambos por las respuestas

El código me funcionaba bien. Tan sólo quería entender bien la lógica de la sentencia
Tu respuesta me aclara mucho la duda, marlanga

Resumiendo AND tiene prioridad sobre OR como la multiplicación sobre la suma. Pensaba que ambas tenían la misma prioridad

De nuevo gracias, me habeis resuelto la duda

Saludos

Etiquetas: operadores, orden
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:39.