Compruebe si int se encuentra entre dos números

¿Por qué no puede hacer esto si intenta averiguar si un int es entre los números:

if(10 < x < 20)

Lugar de ello, usted tendrá que hacer

if(10<x && x<20)

que parece un poco de sobrecarga.

  • Una sobrecarga cómo? A mi entender subestima el tiempo de ejecución de java…
  • Bien, tal vez la sobrecarga es una gran palabra. Pero ¿por qué no podemos hacerlo. Escribo cada vez que en mis clases de matemáticas.
  • Debido a que la sintaxis de Java utiliza. No hay ningún «por qué», es simplemente la manera que es.
  • Willemsen – re el comentario anterior; tal vez lo que estás viendo es un poco exacerbado por su matemáticas de uso, pero en cada día de uso (en un idioma de propósito general) no es un gran problema, así que no vale la pena una sintaxis diferente.
  • Sí, yo sé que no es un problema. Pero es algo que tengo poco molesto porque de ella 😛
  • aprender a no ser molestado por cuestiones sintácticas.
  • Sería muy útil sintaxis de azúcar. Ignorar los imbéciles de aquí que tratan de justificar de una u otra manera. Es una zona gris donde se debe marcar una línea en alguna parte, pero no es un santo de la línea.
  • Independientemente de que Java va a cambiar o no, no es una herejía para el desafío de este tipo de decisión de diseño. Usted puede encontrar «natural de programación» de la investigación a ser sugerente. Estudian cosas como pedir a la gente a ir a una fruta bin y «traer de vuelta a algo que no es una manzana o una pera». Si no entonar el «O» de una manera muy exagerada de la moda, muy poca gente va a volver con una pera…porque nos enteramos de que ya (no (manzana o pera)) en lugar de (no apple) o (pera). Podemos adaptar idiomas para adaptarse mejor a las expectativas humanas. Ver: cs.cmu.edu/~NatProg/index.html
  • Desafiando el lenguaje de las decisiones de diseño está bien … pero es en gran medida una pérdida de tiempo, a menos que usted tiene la intención de hacer algo al respecto. Pero de cualquier manera, es off-topic para ESO.

10 Kommentare

  1. 21

    Uno de los problemas es que un complejo relacional construir introduciría graves analizador de problemas:

    <expr> ::= <expr> <rel-op> <expr> |
               ... |
               <expr> <rel-op> <expr> <rel-op> <expr>

    Cuando intenta expresar una gramática con esas producciones utilizando un típico PGS, usted encontrará que hay un cambio-reducir los conflictos en el punto de la primera <rel-op>. El análisis de las necesidades a lookahead un número arbitrario de símbolos para ver si hay una segunda <rel-op> antes de que pueda decidir si el archivo binario o ternario formulario ha sido utilizado. En este caso, no podía simplemente ignorar el conflicto, ya que el resultado sería incorrecto analiza.

    No estoy diciendo que esta gramática es fatalmente ambigua. Pero creo que sería necesario un retroceso analizador para tratar con él correctamente. Y ese es un grave problema para un lenguaje de programación más rápida que la compilación es un gran punto de venta.

    • De verdad que no. Consulte docs.python.org/reference/expressions.html#notin y docs.python.org/reference/grammar.html de cómo Python maneja.
    • eso es raro. La gramática permite «1 < i < 3 < 4» y así sucesivamente. Supongo que todo es resuelto por el analizador semántico.
    • El uso de su primera producción permite (<expr> <rel-op> <expr>) <rel-op> <expr>, que sería el análisis de la tercera línea (desde Java relacional op quedan asociativa). Yo no soy de ver cómo su ejemplo demuestra su punto.
  2. 10

    Es sólo la sintaxis. ‘<‘ es una operación binaria, y la mayoría de los idiomas no es transitiva. Podrían haber hecho como la forma en que lo diga, pero entonces alguien que se preguntan por qué no pueden hacer otras operaciones en trinarias así. «si (12 < x != 5)»?

    Sintaxis es siempre un trade-off entre la complejidad, la expresividad y la legibilidad. Idioma diferente a los diseñadores de tomar decisiones diferentes. Por ejemplo, SQL tiene «x ENTRE y Y z», donde x, y y z puede ajustar de forma individual o todos a ser columnas, constantes o variables vinculadas. Y estoy feliz de uso en SQL, y estoy igual de feliz que no se preocupe acerca de por qué no en Java.

    • que es simplemente tonto. 12<x!=5 no se trata de una razonable función de solicitud, mientras que el 10<x<20 sin duda lo es. jesús.
    • sin embargo, sólo tal construcción puede ser utilizado en python.
    • En realidad, me gusta Marc respuesta mejor que la mía.
  3. 9

    Debido a que la sintaxis simplemente no está definido? Además, x < y se evalúa como un valor booleano, entonces, ¿qué hace bool < int decir? No es realmente una sobrecarga; además, se podría escribir un método de utilidad si usted realmente desea – isBetween(10,x,20) – no me yo, pero bueno…

    • Curiosamente yo esperaría que el primer argumento de un isBetween() método a ser el valor a la prueba, y el segundo y tercero a ser los límites superior e inferior. No me pidas que te dan una razón, simplemente se siente más cuerdo de esta manera.
    • Yo no iba a conseguir emocionado de preocuparse por el orden, para ser honesto. Hey, soy principalmente un C# hombre, por lo que podría agregar un método de extensión: if(x.IsBetween(10,20)) {...} ;-p
    • ¿Por qué no ir más lejos: si (x.IsBetween(10).Y(20)) 🙂
    • el líquido de la API es bueno y brillante, pero usted está tomando demasiado lejos: ¿Qué x.IsBetween(10)?
    • algunos transitoria de la interfaz. De hecho, este patrón (con una fluidez API) no es infrecuente en (por ejemplo) .NET marcos de las pruebas.
    • ¿qué clase de respuesta es esa? hizo el OP no saben que la sintaxis no es definir? ¿sugerir que el operador ternario no puede existir?
    • re ternario – no, en absoluto sugiero que esta particulares ternario sintaxis no existe, y si lo hizo, probablemente se necesitará algunos ajustes para eliminar la ambigüedad de las existentes < etc (como se indica).

  4. 8

    Podría hacer su propio

    public static boolean isBetween(int a, int b, int c) {
        return b > a ? c > a && c < b : c > b && c < a;
    }

    Edit: lo siento comprueba si c está entre a y b

    • Esto no funciona correctamente porque si usted llega entre 10 y 20, y quieres comprobar 20 devuelve false.
    • eso es lo principal; entre significa, literalmente, entre dos valores. Tan exclusivo.
    • No el de Java por defecto bibliotecas contienen algo como esto?
    • cómo se incluyen los valores de límite? supongamos que a = 100 y b= 200 y c= 100. cómo hacer que esta condición también verdad? En el escenario actual es falso
  5. 7

    La molestia de escribir 10 < x && x < 20 es mínimo en comparación con el aumento en la complejidad del lenguaje si se iba a permitir 10 < x < 20, por lo que los diseñadores del lenguaje Java se decidió en contra de apoyo.

  6. 6

    COBOL permite que (estoy seguro de que algunos otros idiomas también). Java hereda la mayor parte de su sintaxis de C, que no lo permite.

    • Es obvio que mucha agua ha pasado bajo los puentes desde la última vez desarrollado algo en COBOL porque no lo recuerdo. Sólo porque soy nueces y quieres refrescar mi memoria, puede usted por favor comente con una línea de gorras 🙂
    • ESTOY BASTANTE SEGURO de que me RECUERDE HACIENDO QUE EN COBOL (sniff)
    • obviamente, con una sintaxis diferente que es 🙂
    • Ok, me lo pidió 😀
    • Common Lisp permite que cualquier positivo arity para tales operadores de comparación. En el caso de <', the arguments must be monotonically increasing for it to evaluate to t’. Consulte lispworks.com/documentation/HyperSpec/Body/f_eq_sle.htm#LT.
    • El icono también permite la sintaxis 10 < x < 20 porque todas las operaciones resultado en un «éxito o fracasar», así como un valor.

  7. 4

    Que son humanos, y por lo tanto de entender lo que el término «10 < x < 20» supongamos que decir.
    El ordenador no tiene esta intuición, así que se lee como:
    «(10 < x) < 20».

    Por ejemplo, si x = 15, calcular:

    (10 < x) => TRUE

    «TRUE < 20» => ???

    En la programación de C, va a ser peor, ya que no hay Verdadera\Falsos valores.
    Si x = 5, el cálculo será:

    10 < x => 0 (el valor de False)

    0 < 20 => no-0 número (True)

    y por lo tanto «10 < 5 < 20» devolverá True! :S

    • Yo sé cómo funciona. Pero no son los lenguajes de programación no se supone que para hacer las cosas fáciles para los seres humanos? De lo contrario, seguiríamos en la escritura de la asamblea o en códigos binarios.
    • Eso es un punto importante: Hacer «10 < x < 20» ilegal realidad es más útil que hacerlo de la forma C (lo que hace que la expresión válida, pero no hace lo que un no-programador de C esperaría que hacer).
    • Timo – usted puede encontrar este artículo de interés: blogs.msdn.com/ericgu/archive/2004/01/12/57985.aspx. Recuerde, alguien tiene que implementar su solicitud, y depurar, probar y mantener.
    • Pero, ¿no sería aún más útil si la 10 < 5 < 20 acaba de evaluar falso :p
    • Alguien pensó que la herencia múltiple y macros son una buena idea también. Tal vez, pero ¿a qué costo?
    • La cosa buena acerca de la programación en C es que decirle a la computadora exactamente cómo calcular las cosas, que hace que el código sea muy eficiente. Teóricamente, si se escribe «10 < x < 20», ¿qué debe hacer el equipo de primer cheque? «10 < x» o «x < 20»? El uso de «(10 < x && x < 20)» le dice a la computadora para comprobar «10 < x» en primer lugar, y sólo si, es Cierto, que también comprueba si «x < 20». Si usted no se preocupan por el orden en que términos se calculan, google Haskell.
    • Esto no es algo inherente a los equipos en general, sólo para lenguajes de programación más populares. Como otros han señalado, algunos lenguajes de programación permiten la matemática 10 < x < 20 sintaxis.

  8. 0

    Porque el < operador (y la mayoría de los otros) son operadores binarios (toman dos argumentos), y (true true) no es una expresión booleana.

    El lenguaje Java diseñadores podría haber diseñado el idioma para permitir la sintaxis como el tipo que usted prefiera, pero (supongo) se decidió que no valía la pena el más complejo de reglas de análisis.

  9. 0

    simplificando:

    a = 10; b = 15; c = 20
    
    public static boolean check(int a, int b, int c) {
        return a<=b && b<=c;
    }

    Este comprueba si b está entre a y c

  10. -5

    if (10 < x || x < 20)

    Esta declaración evaluará cierto para los números entre 10 y 20.
    Este es un equivalente aproximado a 10 < x < 20

    • 10 < x || x < 20 es equivalente a x < 20 ya que todos (real) de los números de menos de 10 a menos de 20. Por otro lado, 10 < x < 20 es equivalente a 10 < x && x < 20.
    • Esta expresión tiene un error, todos los números reales mayores que 10 y menor que 20, por lo que siempre es cierto.
    • Debe ser «&&», no «||».

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea