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>
の時点でシフト削減の競合があることがわかります。 解析では、任意の数の記号を検索して、バイナリ形式と三元形式のどちらを使用したかを決定する前に、2番目の「< rel-op>」があるかどうかを確認する必要があります。 この場合、誤った解析が発生するため、単に競合を無視することはできません。
この文法が致命的に曖昧であると言っているのではありません。 しかし、正しく処理するにはバックトラッキングパーサーが必要だと思います。 そして、それは高速編集が主要なセールスポイントであるプログラミング言語にとって深刻な問題です。
'<' は二項演算で、ほとんどの言語はこれを推移的なものにはしていません。 しかし、そうすると、なぜ他の演算を三項演算で行えないのか、という疑問が生じます。
文法は常に、複雑さと表現力と読みやすさのトレードオフの関係にあります。 言語設計者によって、その選択はさまざまです。 例えば、SQLには "x BETWEEN y AND z" がありますが、x、y、zはそれぞれ、あるいはすべてが列、定数、束縛変数であることが可能です。 そして、私はSQLでこれを使えることに満足していますし、なぜJavaにないのかを気にしないことにも同様に満足しています。
あなたは人間なので、「10< x< 20」という用語の意味を理解しています。 コンピュータにはこの直感がないので、次のように解釈されます。 「(10< x)< 20」。
たとえば、x = 15の場合、次のように計算されます。
(10< x)=>正しい。
"TRUE< 20" =>。 ???
Cプログラミングでは、True \ False値がないため、状況はさらに悪化します。 x = 5の場合、計算は次のようになります。
10< x => 0(Falseの値)。
0< 20 =>非0番号(真)。
したがって、「10 <5 <20」はTrueを返します。! :S