int が数値の間にあるかどうかを調べようとすると、これができないのはなぜですか。
if(10 < x < 20)
それの代わりに、あなたはしなければならないでしょう
if(10<x && x<20)
これは少しオーバーヘッドのようです。
int が数値の間にあるかどうかを調べようとすると、これができないのはなぜですか。
if(10 < x < 20)
それの代わりに、あなたはしなければならないでしょう
if(10<x && x<20)
これは少しオーバーヘッドのようです。
問題の 1 つは、三項関係構造が深刻なパーサーの問題を引き起こすことです。
<expr> ::= <expr> <rel-op> <expr> |
... |
<expr> <rel-op> <expr> <rel-op> <expr>
典型的な PGS を使用してこれらのプロダクションで文法を表現しようとすると、最初の<rel-op>
. <rel-op>
解析では、2進形式と 3 進形式のどちらが使用されたかを判断する前に、任意の数のシンボルを先読みする必要があります。この場合、競合を単純に無視することはできません。なぜなら、解析が不正確になるからです。
この文法が致命的に曖昧だと言っているわけではありません。しかし、それを正しく処理するには、バックトラッキング パーサーが必要だと思います。これは、高速なコンパイルが主要なセールス ポイントであるプログラミング言語にとって深刻な問題です。
その構文は単に定義されていないためですか?その上、x < y
ブール値として評価されるので、どういうbool < int
意味ですか? これは実際にはオーバーヘッドではありません。さらに、本当に必要isBetween(10,x,20)
な場合は、ユーティリティ メソッドを作成することもできます。
それは単なる構文です。「<」は 2 項演算であり、ほとんどの言語では推移的になりません。彼らはあなたが言うようにそれを作ることができたかもしれませんが、そうすると誰かがあなたが三項で他の操作を行うことができない理由を尋ねるでしょう. "if (12 < x != 5)"?
構文は常に、複雑さ、表現力、読みやすさのトレードオフです。異なる言語設計者は異なる選択をします。たとえば、SQL には "x BETWEEN y AND z" があります。ここで、x、y、および z は個別に、またはすべてが列、定数、またはバインドされた変数になります。そして、私はそれを SQL で使用できることをうれしく思います。また、Java にない理由について心配しなくて済むことも同様にうれしく思います。
タイピングの不便さは10 < x && x < 20
、許容できる言語の複雑さの増加と比較して最小限10 < x < 20
であるため、Java 言語の設計者は Java 言語をサポートしないことにしました。
COBOL ではそれが可能です (他のいくつかの言語も同様であると確信しています)。Java は、その構文のほとんどを C から継承しているため、許可されていません。
あなたは人間なので、「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
単純化:
a = 10; b = 15; c = 20
public static boolean check(int a, int b, int c) {
return a<=b && b<=c;
}
これは、b が a と c の間にあるかどうかをチェックします
<
演算子 (およびその他のほとんど) は二項演算子 (2 つの引数を取る) であり、(true true)
有効なブール式ではないためです。
Java 言語の設計者は、好みの型のような構文を使用できるように言語を設計することもできましたが、(推測では) より複雑な構文解析規則を使用する価値はないと判断しました。
if (10 < x || x < 20)
このステートメントは、10 から 20 までの数値に対して true と評価されます。10 < x < 20