为什么这段代码输出 3 而不是 2?
var i = 1;
i = ++i + --i;
console.log(i);
我期望:
++i // i == 2
--i // i == 1
i = 1 + 1 // i == 2
我在哪里犯错了?
为什么这段代码输出 3 而不是 2?
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 + 1。
按顺序,解释器将执行:
++i // i == 2
+
--i // i == 1
i = 2 + 1
++i
等于 2,`--i' 等于 1。2 + 1 = 3。
你的操作顺序有点偏离。事情是这样的:
因为当您使用 ++i 时, i 的值会递增然后返回。但是,如果使用 i++,则返回 i 的值,然后递增。参考
++$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.
因为您希望此代码能够像引用对象一样工作,并且在完成一元操作之前不会收集值。但在大多数语言中,首先计算表达式,因此 i 返回 i 的值,而不是 i 本身。
如果你有 ++(--i) 那么你是对的。
简而言之,不要这样做。
该操作的结果在每种语言/编译器/解释器中的定义都不相同。因此,虽然它3
会导致 JavaScript,但它可能会导致2
其他地方。