このコードが 2 ではなく 3 を出力するのはなぜですか?
var i = 1;
i = ++i + --i;
console.log(i);
私は期待しました:
++i // i == 2
--i // i == 1
i = 1 + 1 // i == 2
どこで間違えた?
このコードが 2 ではなく 3 を出力するのはなぜですか?
var i = 1;
i = ++i + --i;
console.log(i);
私は期待しました:
++i // i == 2
--i // i == 1
i = 1 + 1 // i == 2
どこで間違えた?
変更は次の順序で行われます。
i
(2 まで)i
足し算の左辺を取る(2)i
(1 に)i
足し算の右辺を取る(1)i
加算を行い(3)に代入++
…そして、あなたがこれをやろうとしているのを見ると、なぜJSLintがand を好まないのかについての洞察が得られます--
。
こう見て
x = (何か)
x = (++i) + (何か)
x = (2) + (何か)
x = (2) + (--i)
x = (2) + (1)
項は左から右に評価されます。最初の ++i が評価されると、--i で値を変更しても再評価されません。
2 行目は 2 + 1 を追加しています。
順番に、インタープリターは次を実行します。
++i // i == 2
+
--i // i == 1
i = 2 + 1
これは、これが参照オブジェクトであるかのようにこのコードが機能することを期待しており、単項演算が完了するまで値が収集されないためです。ただし、ほとんどの言語では、式が最初に評価されるため、iはi自体ではなく、iの値を返します。
あなたが++(-i)を持っていたなら、あなたは正しいでしょう。
要するに、これをしないでください。
その操作の結果は、すべての言語/コンパイラ/インタプリタで同じように定義されているわけではありません。そのため3
、JavaScriptが生成されますが、他の場所が生成される可能性があり2
ます。
++i を使用すると、 i の値がインクリメントされてから返されるためです。ただし、i++ を使用すると、i の値が返されてからインクリメントされます。参照
++i
は 2 に等しく、`--i' は 1 に等しくなります。2 + 1 = 3。
操作の順序が少しずれています。手順は次のとおりです。
++$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.