int が 2 つの数値の間にあるかどうかを調べようとする場合、なぜこれを実行できないのですか。
if(10 < x < 20)
その代わりに、
if(10<x && x<20)
少しオーバーヘッドがかかるようです。
ベストアンサー1
1 つの問題は、3 項リレーショナル構造によって深刻なパーサーの問題が発生する可能性があることです。
<expr> ::= <expr> <rel-op> <expr> |
... |
<expr> <rel-op> <expr> <rel-op> <expr>
典型的な PGS を使用してこれらの生成物を含む文法を表現しようとすると、最初の の時点でシフト削減競合が発生することがわかります<rel-op>
。解析では、2 項形式または 3 項形式が使用されているかどうかを判断する前に、任意の数のシンボルを先読みして、1 秒前があるかどうかを確認する必要があります<rel-op>
。この場合、競合を単純に無視することはできません。そうすると、誤った解析が発生します。
この文法が致命的に曖昧だと言っているのではありません。しかし、これを正しく処理するにはバックトラッキング パーサーが必要だと思います。これは、高速コンパイルが大きなセールス ポイントであるプログラミング言語にとっては深刻な問題です。