web-dev-qa-db-ja.com

intが2つの数値の間にあるかどうかを確認します

Intが数字の間にあるかどうかを調べようとすると、なぜこれができないのですか:

if(10 < x < 20)

その代わりに、あなたがする必要があります

if(10<x && x<20)

これは少しオーバーヘッドのようです。

30
Timo Willemsen

1つの問題は、三項関係構造が深刻なパーサーの問題を引き起こすことです。

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

典型的なPGSを使用してこれらのプロダクションで文法を表現しようとすると、最初の<rel-op>の時点でshift-reduceの競合があることがわかります。解析では、バイナリ形式またはターナリ形式のどちらが使用されているかを判断する前に、2番目の<rel-op>があるかどうかを確認するために、任意の数のシンボルを先読みする必要があります。この場合、不正確な解析が発生するため、単に競合を無視することはできません。

この文法が致命的に曖昧だと言っているのではありません。しかし、正しく処理するにはバックトラッキングパーサーが必要だと思います。そしてそれは、高速コンパイルが大きなセールスポイントであるプログラミング言語にとって深刻な問題です。

21
Stephen C

それは単なる構文です。 「<」は二項演算であり、ほとんどの言語では推移的になりません。彼らはあなたの言うようにそれを作ることができたかもしれませんが、それから誰かはあなたがなぜ同様に三進法で他の操作をできないのかを尋ねるでしょう。 「if(12 <x!= 5)」?

構文は常に、複雑さ、表現力、読みやすさのトレードオフです。異なる言語デザイナーは異なる選択をします。たとえば、SQLには "x BETWEEN y AND z"があります。x、y、およびzは、個別に、またはすべてを列、定数、またはバインド変数にすることができます。そして、SQLでそれを使用できてうれしいです。また、なぜJavaにないのか心配しないことも嬉しいです。

10
Paul Tomblin

その構文は単に定義されていないためですか?それに、_x < y_はブールとして評価されるので、_bool < int_はどういう意味ですか?実際にはオーバーヘッドではありません。また、really want-isBetween(10,x,20)-私はmyselfではないが、ちょっと...

9
Marc Gravell

あなたは自分で作ることができます

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

編集:cがaとbの間にあるかどうかを確認してください

8
IceSteve

10 < x && x < 20を許可する場合の言語の複雑さの増加と比較すると、10 < x < 20の入力の不便さは最小限であるため、Java言語の設計者はサポートすることを決定しました。

7
starblue

COBOLはそれを可能にします(他のいくつかの言語も同様です)。 Javaは、それを許可しないCの構文のほとんどを継承しています。

6
TofuBeer

あなたは人間であるため、「10 <x <20」という用語の意味を理解しています。コンピューターはこの直感を持たないため、「(10 <x)<20」と読み取ります。

たとえば、x = 15の場合、計算は次のようになります。

(10 <x)=> TRUE

「TRUE <20」=> ???

Cプログラミングでは、True\False値がないため、さらに悪化します。 x = 5の場合、計算は次のようになります。

10 <x => 0(Falseの値)

0 <20 => 0以外の数(True)

したがって、「10 <5 <20」はTrueを返します! :S

4
Oren

なぜなら <演算子(および他のほとんど)は2項演算子(2つの引数を取ります)、および(true true)は有効なブール式ではありません。

Java言語設計者は、好みのタイプのような構文を許可するように言語を設計できたかもしれませんが、より複雑な構文解析ルールの価値はないと判断しました。

0

簡素化:

a = 10; b = 15; c = 20

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

これは、bがaとcの間にあるかどうかをチェックします

0
Sergio76