2

このコードが 2 ではなく 3 を出力するのはなぜですか?

var i = 1; 
i = ++i + --i; 
console.log(i);

私は期待しました:

++i // i == 2
--i // i == 1
i = 1 + 1 // i == 2

どこで間違えた?

4

8 に答える 8

10

変更は次の順序で行われます。

  1. 増分i(2 まで)
  2. i足し算の左辺を取る(2)
  3. デクリメントi(1 に)
  4. i足し算の右辺を取る(1)
  5. i加算を行い(3)に代入

++…そして、あなたがこれをやろうとしているのを見ると、なぜJSLintがand を好まないのかについての洞察が得られます--

于 2011-08-02T16:38:27.420 に答える
3

こう見て

x = (何か)
x = (++i) + (何か)
x = (2) + (何か)
x = (2) + (--i)
x = (2) + (1)

項は左から右に評価されます。最初の ++i が評価されると、--i で値を変更しても再評価されません。

于 2011-08-02T16:39:40.997 に答える
2

2 行目は 2 + 1 を追加しています。

順番に、インタープリターは次を実行します。

++i  // i == 2
+
--i  // i == 1
i = 2 + 1
于 2011-08-02T16:38:26.123 に答える
0

これは、これが参照オブジェクトであるかのようにこのコードが機能することを期待しており、単項演算が完了するまで値が収集されないためです。ただし、ほとんどの言語では、式が最初に評価されるため、iはi自体ではなく、iの値を返します。

あなたが++(-i)を持っていたなら、あなたは正しいでしょう。

要するに、これをしないでください。

その操作の結果は、すべての言語/コンパイラ/インタプリタで同じように定義されているわけではありません。そのため3、JavaScriptが生成されますが、他の場所が生成される可能性があり2ます。

于 2012-08-03T14:16:31.657 に答える
0

++i を使用すると、 i の値がインクリメントされてから返されるためです。ただし、i++ を使用すると、i の値が返されてからインクリメントされます。参照

于 2011-08-02T16:39:10.297 に答える
0

++iは 2 に等しく、`--i' は 1 に等しくなります。2 + 1 = 3。

于 2011-08-02T16:38:42.060 に答える
0

操作の順序が少しずれています。手順は次のとおりです。

  1. i は 1 ずつインクリメントされ (++i)、値は 2 になります。これは i に格納されます。
  2. 次に、その値 2 が (--i) の値 1 に加算されます。2 + 1 = 3
于 2011-08-02T16:39:01.247 に答える
0
++$a   Increments $a by one, then returns $a.
$a++   Returns $a, then increments $a by one.
--$a   Decrements $a by one, then returns $a.
$a--   Returns $a, then decrements $a by one.
于 2011-08-02T16:41:45.813 に答える