単項演算子 “++”と ” – “奇妙な状況

単項演算子 “++”と ” – “奇妙な状況

タグ:

質問

単項演算子 “++”を使用するためのテスト状況は次のとおりです。

var j = 0 ;
console.log(j);
j = j++;
console.log(j);

このため、出力は次のとおりです。

0
0

++演算子の位置はオペランドの後ろにあるので、その優先順位は代入の優先順位よりも低いので、最初に “j”がそれ自身の値(i.e.0)を受け取ることを期待しますが、インクリメントされます。では、なぜ2番目のconsole.log(j)呼び出しはまだ “0”を表示していますか?

明確にするために、私は解決策が次のとおりであることを知っています:

// 1)
j++;
// 2)
++j;
// 3)
j += 1;
// 4)
j = ++j;

しかし、この特定のシナリオでインクリメントステップが実行されない理由を知る必要があります。

ベストアンサー

これは、post-incrementを使用するときの直感的ではありません(ただし、「奇妙な」動作ではありません!)。

ステートメントj = j++はこれを行います:

  1. LHS を評価する
    • この場合、単に変数の名前を付けただけなので特別なことはありませんが、これは必ずしもそうではないかもしれません。 foo() = j++
  2. RHS を評価する
    • j(0)の現在の値を取得し、その結果を覚えておいてください。
    • インクリメントj(1を取得する);
  3. RHSをLHSに割り当てる
    • RHSはj(0)の「記憶された」値と評価されることを思い出してください。

結果は noop です。

ここでの鍵は、RHS全体が評価され、最終的な割り当ての前に実行された後増分が行われることです。

https://www.ecma-international.org/ecma-262/5.1/#sec-11.3.1
または https://www.ecma-international.org/ecma-262/5.1/#sec-11.13.1




source
Delphiの単項++演算子
単項演算子の演算子優先順位
単項演算子のオーバーロード&
[:-eq:単項演算子が必要です
単項プラス演算子の使用
単項演算子は何をしますか?
オーバーロード+/ – 単項演算子
単項疑問符(?)演算子は何をしますか?
Rubyの単項+演算子のポイントは何ですか?
単項演算子〜はnumpyで何をしますか?
Rating