web-dev-qa-db-fra.com

Vérifier si int est entre deux nombres

Pourquoi ne pouvez-vous pas faire cela si vous essayez de savoir si un int est compris entre deux chiffres:

if(10 < x < 20)

Au lieu de cela, vous devrez faire

if(10<x && x<20)

ce qui semble un peu de frais généraux.

29
Timo Willemsen

L’un des problèmes est qu’une construction relationnelle ternaire introduirait de graves problèmes d’analyseur:

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

Lorsque vous essayez d'exprimer une grammaire avec ces productions à l'aide d'un PGS typique, vous constatez qu'il existe un conflit de réduction de décalage au point du premier <rel-op>. L'analyse doit rechercher un nombre arbitraire de symboles pour voir s'il existe un second <rel-op> avant de pouvoir décider si la forme binaire ou ternaire a été utilisée. Dans ce cas, vous ne pouvez pas simplement ignorer le conflit car cela entraînerait des analyses syntaxiques incorrectes.

Je ne dis pas que cette grammaire est fatalement ambiguë. Mais je pense que vous auriez besoin d'un analyseur de retour en arrière pour le gérer correctement. Et c’est un problème grave pour un langage de programmation où la compilation rapide est un argument de vente majeur.

21
Stephen C

Parce que cette syntaxe n'est tout simplement pas définie? De plus, x < y est considéré comme un booléen, alors que signifie bool < int? Ce n'est pas vraiment une surcharge; de plus, vous pourriez écrire une méthode utilitaire si vous vraiment voulez - isBetween(10,x,20) - je ne voudrais pas moi-même, mais bon….

10
Marc Gravell

C'est juste la syntaxe. '<' est une opération binaire, et la plupart des langues ne la rendent pas transitive. Ils auraient pu le faire comme vous le dites, mais quelqu'un vous demanderait alors pourquoi vous ne pouvez pas effectuer d'autres opérations en mode binaire. "si (12 <x! = 5)"?

La syntaxe est toujours un compromis entre complexité, expressivité et lisibilité. Différents concepteurs de langage font des choix différents. Par exemple, SQL a "x BETWEEN y AND z", où x, y et z peuvent individuellement ou tous être des colonnes, des constantes ou des variables liées. Et je suis heureux de l'utiliser en SQL, et je suis également heureux de ne pas m'inquiéter de la raison pour laquelle ce n'est pas en Java.

10
Paul Tomblin

Vous pourriez faire le vôtre

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

Edit: désolé vérifie si c est entre a et b

8
IceSteve

Le désagrément de taper 10 < x && x < 20 est minime par rapport à l'augmentation de la complexité du langage si l'on autorisait 10 < x < 20; les concepteurs du langage Java ont donc décidé de ne pas le prendre en charge.

7
starblue

COBOL le permet (je suis sûr que d’autres langues le font aussi). Java a hérité de la majeure partie de sa syntaxe de C qui ne le permet pas. 

6
TofuBeer

Vous êtes humain et vous comprenez donc ce que le terme "10 <x <20" doit signifier… . L'ordinateur n'a pas cette intuition, il se lit ainsi: 20 ".

Par exemple, si x = 15, il calculera:

(10 <x) => TRUE

"TRUE <20" => ???

En programmation C, ce sera pire, car il n’existe pas de valeur True\False . Si x = 5, le calcul sera le suivant:

10 <x => 0 (la valeur de False)

0 <20 => nombre non-0 (vrai)

et donc "10 <5 <20" retournera vrai! : S

4
Oren

Parce que l'opérateur < (et la plupart des autres) sont des opérateurs binaires (ils prennent deux arguments), et que (true true) n'est pas une expression booléenne valide.

Les concepteurs de langage Java auraient pu concevoir le langage de manière à autoriser une syntaxe du type que vous préférez, mais (je suppose) ils ont décidé que cela ne valait pas les règles d'analyse plus complexes.

0
Michael Petrotta

simplifiant:

a = 10; b = 15; c = 20

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

Ceci vérifie si b est entre a et c

0
Sergio76