Timo Willemsen
Timo Willemsen

Reputation: 8857

Check if int is between two numbers

Why can't do you this if you try to find out whether an int is between to numbers:

if(10 < x < 20)

Instead of it, you'll have to do

if(10<x && x<20)

which seems like a bit of overhead.

Upvotes: 33

Views: 180802

Answers (11)

30thh
30thh

Reputation: 11376

One can use Range class from the Guava library:

 Range.open(10, 20).contains(n)

Apache Commons Lang has a similar class as well.

Upvotes: 0

Sergio76
Sergio76

Reputation: 3986

simplifying:

a = 10; b = 15; c = 20

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

This checks if b is between a and c

Upvotes: 1

Stephen C
Stephen C

Reputation: 718758

One problem is that a ternary relational construct would introduce serious parser problems:

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

When you try to express a grammar with those productions using a typical PGS, you'll find that there is a shift-reduce conflict at the point of the first <rel-op>. The parse needs to lookahead an arbitrary number of symbols to see if there is a second <rel-op> before it can decide whether the binary or ternary form has been used. In this case, you could not simply ignore the conflict because that would result in incorrect parses.

I'm not saying that this grammar is fatally ambiguous. But I think you'd need a backtracking parser to deal with it correctly. And that is a serious problem for a programming language where fast compilation is a major selling point.

Upvotes: 22

Nakabo
Nakabo

Reputation: 1

if (10 < x || x < 20)

This statement will evaluate true for numbers between 10 and 20. This is a rough equivalent to 10 < x < 20

Upvotes: -5

IceSteve
IceSteve

Reputation: 577

You could make your own

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

Edit: sorry checks if c is between a and b

Upvotes: 8

Paul Tomblin
Paul Tomblin

Reputation: 182792

It's just the syntax. '<' is a binary operation, and most languages don't make it transitive. They could have made it like the way you say, but then somebody would be asking why you can't do other operations in trinary as well. "if (12 < x != 5)"?

Syntax is always a trade-off between complexity, expressiveness and readability. Different language designers make different choices. For instance, SQL has "x BETWEEN y AND z", where x, y, and z can individually or all be columns, constants, or bound variables. And I'm happy to use it in SQL, and I'm equally happy not to worry about why it's not in Java.

Upvotes: 10

starblue
starblue

Reputation: 56762

The inconvenience of typing 10 < x && x < 20 is minimal compared to the increase in language complexity if one would allow 10 < x < 20, so the designers of the Java language decided against supporting it.

Upvotes: 7

Oren
Oren

Reputation: 2807

You are human, and therefore you understand what the term "10 < x < 20" suppose to mean. The computer doesn't have this intuition, so it reads it as: "(10 < x) < 20".

For example, if x = 15, it will calculate:

(10 < x) => TRUE

"TRUE < 20" => ???

In C programming, it will be worse, since there are no True\False values. If x = 5, the calculation will be:

10 < x => 0 (the value of False)

0 < 20 => non-0 number (True)

and therefore "10 < 5 < 20" will return True! :S

Upvotes: 4

TofuBeer
TofuBeer

Reputation: 61526

COBOL allows that (I am sure some other languages do as well). Java inherited most of it's syntax from C which doesn't allow it.

Upvotes: 6

Michael Petrotta
Michael Petrotta

Reputation: 60902

Because the < operator (and most others) are binary operators (they take two arguments), and (true true) is not a valid boolean expression.

The Java language designers could have designed the language to allow syntax like the type you prefer, but (I'm guessing) they decided that it was not worth the more complex parsing rules.

Upvotes: 0

Marc Gravell
Marc Gravell

Reputation: 1062650

Because that syntax simply isn't defined? Besides, x < y evaluates as a bool, so what does bool < int mean? It isn't really an overhead; besides, you could write a utility method if you really want - isBetween(10,x,20) - I wouldn't myself, but hey...

Upvotes: 10

Related Questions