問題タブ [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.
java - post++ および --pre 演算子の操作
インクリメントとデクリメント操作post
で疑問に思っています。pre
isとisJava
の優先順位で私が知っていること.while演算子の結合性はpost operator
high
associativity
left-to-right
pre
right-to-left
しかし、私のコードは望ましくない結果を示しています-
c++ - C++: * (乗算) 演算子の結合性が左から右ではありません
学校の課題に取り組んでいる間、演算子のオーバーロードとテンプレートで何かをしなければなりませんでした。すべてクール。私が書いた:
次に、友人が、彼のコードが「間違った」順序で出力を生成した理由を尋ねました。彼は次のようなものを持っていました
のコードはr->evaluate()
、 の前にデバッグ情報を出力しl->evaluate()
ました。これらの 3 行をワンライナーに変更するだけで、自分のマシンでもテストしました。
*
それで、それなら右から左への結合であるべきだと思いました。しかし、インターネット上のどこでも、彼らはそれが左から右であると言います. 追加のルールはありますか?テンプレートを使用する際に何か特別なことがありますか? または、これは VS2012 のバグですか?
javascript - JavaScript での 2 つの代入演算子を含む複合式の評価プロセス
以下は、2 つの代入演算子を含む複合式です。
トリッキーな部分は 3 行目です。
IMHO、代入演算子=
は右結合であるため、式のネスト構造は次のとおりです。
ただし、 ES5 Annex Dによると、ES5 の評価順序は常に左から右です。
ES5 セクション 11.13.1によると、
プロダクションAssignmentExpression : LeftHandSideExpression = AssignmentExpressionは次のように評価されます。
- lrefをLeftHandSideExpressionの評価結果とします。
- AssignmentExpressionを評価した結果を rref とします。
- rvalを GetValue( rref )とします。
- 次の条件がすべて真の場合、 SyntaxError例外をスローします: ....スペースを節約するために意図的に省略されています
- PutValue( lref , rval )。
- rvalを返します。
したがって、左から右への評価順序についての私の理解は次のとおりです。
- 最初に評価し、その参照を
a.x
返しますlref1
a = {m: 2}
を取得するために評価しrref1
ます。これは代入式でもあるため、手順を再度開始します (再帰のように)。2.1. 最初に評価し、その参照を
a
返しますlref2
2.2.
{m: 2}
まさにオブジェクト{m: 2}
を評価して返すrref2
2.3. Let
rval2
= 、オブジェクトもGetValue(rref2)
そうですrval2
{m: 2}
2.4.
PutValue(lref2, rval2)
の代わりにa
オブジェクトを再バインドします。{m: 2}
{n: 1}
2.5。return
rval2
、つまりオブジェクト{m: 2}
asrref1
(参照型ではなくオブジェクト)Let
rval1
=GetValue(rref1)
、これはまさにオブジェクトでもあります{m: 2}
PutValue(lref1, rval1)
なので、参照するメモリアドレスlref1
は になります{m: 2}
。そして、b.x
まだこのアドレスを参照し、b
更新されます.
この手順は ES5 仕様に準拠しており、結果をよく説明しています。
私の質問は次のとおりです。
上記の評価順序は真か偽か?間違っている場合、別の説明はありますか?
ES5の参照仕様タイプを適切に理解するには? 特定のメモリアドレスを参照するのは単なる中間ポインタですか?
c - この単純な C プログラムの出力を説明してください
これは yashwant kanetkar の単純な C プログラムですが、私は答えに関係することができませんでした。このプログラムをコンパイルすると、得られる出力は
これは非常に単純なプログラムですが、結合性と混同されている可能性があるため、出力を説明できません。/ と * の両方に L から R への結合性があり、/ だけが明確な左オペランド (L から R への結合性に必要な条件) を持っている場合は、先に実行されます。しかし、その場合は答えが異なります。
r - Rで右から左への演算子の結合性は可能ですか?
私はRが初めてで、ブラケット恐怖症に苦しんでいることを発見しました(リンクのコメントを参照)。場合によってはネストされた括弧が回避され、コードが読みやすくなるため、magrittr
表記法が機能する方法が気に入っています。%>%
私は から来ました、何をするかについてMathematica
非常によく似たネイティブ表記法があります。R と Mathematica の比較を次に示します。//
%>%
ここまでは順調ですが、私の質問は次のとおりです。
Mathematica の @ 記法を模倣して、右から左への結合を行う方法はありR
ますか?
上記の同じコードを解くために、Mathematica でどのように機能するかを次に示します。
Mathematica では、次のように書くこともできます。
次のようにR
なります。
R
しかし、次のようなものを含めると、はるかにクリーン (かつクール) になります。
PS:@
が S4 クラスで使用されていることはわかっていますが、これはお勧めできません。これは単なる例示的な比較です。
c - このステートメントはどの優先順位で評価されますか?
それは試験からの質問ですP
。配列内の任意の要素へのポインターである場合、このステートメントが実際に何をするかを説明してください。
それを評価するための簡単なコードも書きました。
しかし、出力は私をさらに混乱させます:
P
最初に を逆参照し、次にその値を増やしてから pointer の値を減らすように見えますP
が、なぜですか?
p53 の K&R 表 2-1 (下の図を参照) によると、++、 --、および * (逆参照) は、右から左に同じ優先順位と結合規則を持っています。したがって、最初のステップはの値を減らしP
、次に逆参照してから逆参照された値を増やす必要があります。間違っていますか?
c - C の関数呼び出し演算子の結合性
C 演算子の結合性のトピックを調べていました。
()
そこで、関数呼び出し演算子には左から右への結合性があるという事実に出くわしました。ただし、結合性は、同じ優先順位の複数の演算子が式に出現する場合にのみ機能します。しかし、結合性が重要な役割を果たす関数呼び出し演算子を含む例は見つかりませんでした。
たとえば、ステートメントa = f(x) + g(x);
では、結果は評価順序に依存し、2 つの関数呼び出しの結合性には依存しません。同様に、呼び出しは最初にf(g(x))
function を評価g()
し、次にfunction を評価しますf()
。ここではネストされた関数呼び出しがあり、ここでも結合性は何の役割も果たしません。
この優先度グループの他の C 演算子は、配列添字[]
とpostfix ++
ですpostfix --
。しかし、これらの演算子の組み合わせと、結合()
性が式の評価に関与する例を見つけることができませんでした。
だから私の質問は、左から右に定義されている関数呼び出しの結合性は、C の式に影響しますか? ()
関数呼び出し演算子の結合性が式の評価に関係する例を誰か提供できますか?