問題タブ [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.
python - Associativity of comparison operators in Python
Pythonの比較演算子の結合性は何ですか? 3 つの比較については簡単ですが、それ以上の場合は、どうすればよいかわかりません。それらは右結合でも左結合でもないようです。
例えば:
したがって、左結合ではありません。
したがって、右結合でもありません。
それらが「連鎖」している場所をいくつか見てきましたが、4 つ以上の比較ではどのように機能しますか?
javascript - 複数代入の混乱
代入演算子が右結合であることは理解しています。
たとえば x = y = z = 2
、(x = (y = (z = 2)))
ということで、以下のことを試してみました。
オブジェクトfoo
が値で作成され{a:1}
、次にプロパティx
が作成されfoo
、オブジェクトへの参照になると予想していましたfoo
。
(これは、複数の代入ステートメントを 2 つの別個のステートメントに分割した場合に実際に起こることですfoo = {a:1};foo.x = foo;
)
実際の結果は次のとおりです。
ReferenceError: foo が定義されていません(…)
それで、私は次のことを試しました:
これで例外は発生しなくなりましたが、foo.x
未定義です!
割り当てが期待どおりに機能しないのはなぜですか?
免責事項:「重複」の質問は、私が求めているものとは大きく異なるようです。問題は、割り当てで作成された変数がグローバルであり、
var
キーワードで作成された変数に並置されているためです。それはここでは問題ではありません。
c++ - 整数オーバーフローと演算順序
私は最近、私の C++ コードで問題に直面し、コンパイラが長い操作で何をするかについて誤解しているのではないかと思いました...次のコードを見てください。
私にとって、これらの 3 行のいずれかで乗算が発生する順序は定義されていません。int
ただし、これが私が予想したことです( 32b、long long
64bで、両方ともIEEEルールに従っていると仮定します):
- 2 行目では、中間結果として s を使用してかっこが最初に評価さ
int
れ、オーバーフローが発生して -1073741824 が格納されます。この中間結果は最後の乗算に昇格されるlong long
ため、出力される結果は -5368709120 になります。 - 評価の順序が定義されていないため、1 行目と 3 行目は「同等」です。
ここで、行 #1 と #3 については不明です。評価の順序は定義されていませんが、コンパイラはすべての操作を最大のオペランドの型、つまりlong long
ここに「昇格」させると思いました。したがって、この場合、すべての計算が 64b で行われるため、オーバーフローは発生しません...しかし、これは GCC 5.3.0 がこのコードに対して私に与えるものです:
最初の結果も 16106127360 と予想していました。GCC にこの規模のコンパイラのバグがあるとは思えないので、バグはキーボードと椅子の間にあると思います。
これは未定義の動作であり、GCCは私に与えるものは何でも正しいことを確認/確認してください(これは未定義であるため)?
haskell - 式で右連想演算を使用するには?
私は独自の演算子を定義しました:
まさに連想です。
そして今、次の式で使用したいと思います:
しかし、私はエラーが発生します:
どうすれば修正できますか?
parsing - 連想性と自己参照生成を伴う LL 文法
私はパーサー文法を書こうとしていますが、現在、(Antlr で) LL 文法の次のプロダクションを持っています。右結合である「#」で区切られた 1 つ以上 (数字または文字列) を解析しようとしています。現時点で 1 つだけではなく、「#」で区切られた 1 つ以上の文字列を解析できるように、プロダクションを変更するにはどうすればよいですか?
この文法の言語の例:
EBNFフォームを使ってみた
しかし、それは私の文法があいまいになります。このあいまいさをどのように修正しますか?
c++ - C++ : このステートメントはどのように解析されますか?
私は C++ で演算子の結合性を学ぼうとしており、コード セグメントに出くわしました:
++a
また、右から左への結合と左から右への結合についても調べましたa++
。また+
、左から右への結合です。しかし、この知識をこの問題に適用する方法がわかりません。
このステートメントがコンパイラによってどのように解析されるのか混乱していますか?
スペースを入れてもあまり問題にならないので、なぜスペースを削除するのが次のようになるのか、私も困惑しています:
エラーを生成しますか?この概念を理解するのを手伝ってください。
ありがとう!