Pregunta
Esto funciona bien
if ((a >= 40 && a <= 50) || (a >= 60 && a <= 80))
// do something
¿Cómo hago al revés?
if ((a < 40 && a > 50) || (a < 60 && a > 80))
// do something
El código no funciona como se esperaba. Quiero algo como si no (condición)
Solución
Es posible que desee consultar las leyes de De Morgan .
1. !((a >= 40 && a <= 50) || (a >= 60 && a <= 80))
2. (!(a >= 40 && a <= 50) && !(a >= 60 && a <= 80))
3. ((!(a >= 40) || !(a <= 50)) && (!(a >= 60) || !(a <= 80))
4. ((a < 40 || a > 50) && (a < 60 || a > 80))
or in other words: (a < 40 || (50 < a && a < 60) || 80 < a)
Otros consejos
if ((a < 40 || a > 50) && (a < 60 || a > 80))
// do something
Si bien recomendaría descubrir cómo hacer que funcione correctamente (reescribiéndolo)
if (!((a >= 40 && a <= 50) || (a >= 60 && a <= 80)))
debería funcionar, creo.
Necesita un " O "
if ((a < 40 || a > 50) && (a < 60 || a > 80))
O, un NO
if (!((a >= 40 && a <= 50) || (a >= 60 && a <= 80)))
Tu segundo ejemplo
if ((a < 40 && a > 50) || (a < 60 && a > 80))
no tiene sentido ya que a
no puede ser menor que 40 y mayor que 50 (o menor que 60 y mayor que 80) al mismo tiempo.
Algo así
if (!((a < 40 && a > 50) || (a < 60 && a > 80)))
o
if ((a < 40 || a > 50) && (a < 60 || a > 80))
if (!((a >= 40 && a <= 50) || (a >= 60 && a <= 80)))
Suponiendo que desea el equivalente de
if ( not ((a >= 40 && a <= 50) || (a >= 60 && a <= 80)) )
entonces, si piensa en la expresión original, debería ser
if (a < 40 || (a > 50 && a < 60) || a > 80)
La primera expresión es permitir que a
sea un número del 40 al 50 o del 60 al 80. Niegue eso en inglés y desea un número menor que 40 o entre 50 y 60 o más de 80.
Las leyes de De Morgan pueden darle una respuesta precisa, pero prefiero un código que pueda leer en voz alta y tener sentido.