問題タブ [associativity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 二項ブール演算子には結合性がありますか?
はa && b && c
言語によって定義されており、(a && b) && c
またはa && (b && c)
?
うわー、ジェリーは速かった。質問を強化するには、それは実際に重要ですか? a && b && c
またはとして解釈される間に観察可能な違いはあります(a && b) && c
かa && (b && c)
?
scala - パーサー コンビネーターの文法が正しい結合規則を生成しない
私は単純な式パーサーに取り組んでいますが、以下のパーサー コンビネーター宣言を考えると、テストに合格できないようで、正しい連想ツリーがポップアップし続けます。
私はこれのために何時間もデバッグしてきました。誰かがそれが正しく出ていないことを理解するのを手伝ってくれることを願っています.
"5-4-3" は、予想される -2 ではなく 4 に評価されるツリーを生成します。
上記の文法のどこが間違っていますか?
parsing - 式パーサーの文法と左結合性
私は、変数を使用して式のパーサーを作成し、それらを二次式の形式に単純化しようとしています。
これは私のパーサー文法です:
解析には、再帰降下パーサーを使用しています。これを解析したいとしましょう:
「2 - 1 + 1 = 0」
結果が 0 の場合、パーサーは間違ったツリーを作成します:
この文法を左結合にするにはどうすればよいですか? 私はこれが初心者です。より多くの情報を見つけることができるソースを教えてください。再帰降下パーサーでこれを達成できますか?
haskell - Haskellの右結合の関数合成はなぜですか?
数学的には、関数合成操作は連想的です。したがって:
したがって、関数合成操作は、左結合または右結合のいずれかとして定義できます。
私の意見では、Haskell での通常の関数の適用 (つまり、$
操作ではなく用語の並置) は連想のままなので、関数の合成も連想のままにしておく必要があります。結局、世界のほとんどの人 (私を含む) は、左から右に読むことに慣れています。
それにもかかわらず、Haskell の関数合成は右結合です。
関数合成操作が左結合であるか右結合であるかは、実際には違いがないことを私は知っています。それにもかかわらず、なぜ連想のままにされないのか知りたいです。この設計上の決定について、次の 2 つの理由が頭に浮かびます。
- Haskell の作成者は、関数合成が演算と同じくらい論理的に似ていることを望んでいました
$
。 - Haskell の作成者の 1 人は、関数合成を左結合ではなく右結合にする方が直感的であることに気付いた日本人でした。
冗談はさておき、関数合成が Haskell で右結合的であるという有益な理由はありますか? Haskell の関数合成を連想のままにしておくと、何か違いはありますか?
php - 三項演算子の左結合性
PHP のマニュアルでは、"Operators"の下に次のような "ユーザー投稿メモ" があります。
php では、三項演算子 ?: は C や C++ では右結合性を持つのとは異なり、左結合性を持つことに注意してください。
次のようなコードを書くことはできません (C/C++ で慣れているかもしれません)。
実際に試してみると、本当に印刷されfour
ます。ただし、その背後にある理由を理解できず、印刷する必要があると感じていますtwo
またはother
.
ここで何が起こっているのか、なぜ「4」と表示されているのか説明してもらえますか?
javascript - JavaScript の論理演算子が左結合であるのはなぜですか?
論理 AND および OR 演算子は、三項条件演算子とともに JavaScript で唯一の遅延演算子です。これらは、次の規則を使用して短絡評価のためにテストされます。
これは、Haskell での実装と同じ方法です。
ただし、MDN によると、JavaScript の論理演算子は結合のままです。これは直感に反します。私の謙虚な意見では、それらは右結合でなければなりません。Haskell は正しいことを行います。Haskell の論理演算子は右結合です。
Haskell で次の式を考えてみましょう。
は Haskell では右結合であるため&&
、上記の式は次と同等です。
(True && (True && True))
したがって、式が何に評価されるかは問題ではありません。最初False
の式により、式全体がFalse
1 つのステップで縮小されます。
&&
を連想のままにしておくとどうなるかを考えてみましょう。式は次のようになります。
式全体を評価するには、3 つの削減が必要になります。
ご覧のとおり、論理演算子は右結合である方が理にかなっています。これは私の実際の質問に私をもたらします:
JavaScript の論理演算子が左結合であるのはなぜですか? ECMAScript 仕様は、これについて何を述べているのでしょうか? JavaScript の論理演算子は実際に右結合ですか? MDN ドキュメントには、論理演算子の結合性に関する誤った情報がありますか?
編集:仕様によると、論理演算子は結合されたままです:
c++ - C 演算子の優先順位と結合性を定義するのは誰ですか?
序章
C/C++ のすべての教科書には、次のような演算子の優先順位と結合規則の表があります。
http://en.cppreference.com/w/cpp/language/operator_precedence
StackOverflow に関する質問の 1 つに、次のような質問がありました。
次の関数が実行される順序は次のとおりです。
f1() * f2() + f3();
f1() + f2() * f3();
前のチャートを参照すると、関数には左から右への結合性があると自信を持って答えたので、前のステートメントでは、両方の場合で次のように評価されます。
f1() -> f2() -> f3()
関数が評価されたら、次のように評価を終了します。
(a1 * a2) + a3
a1 + (a2 * a3)
驚いたことに、多くの人が私が完全に間違っていると言いました。それらが間違っていることを証明しようと決心した私は、ANSI C11 標準に目を向けることにしました。演算子の優先順位と結合性についてほとんど言及されていないことに、またしても驚かされました。
質問
- 関数は常に左から右に評価されるという私の信念が間違っているとすれば、関数の優先順位と結合性に関する表は、実際には何を意味するのでしょうか?
- ANSI でない場合、演算子の優先順位と結合性を定義するのは誰ですか? 定義を行うのが ANSI である場合、演算子の優先順位と結合規則についてほとんど言及されていないのはなぜですか? 演算子の優先順位と結合性は、ANSI C 標準から推測されますか、それとも数学で定義されていますか?