【发布时间】:2014-01-20 13:36:11
【问题描述】:
下面是一个使用一元运算符“++”的测试情况:
var j = 0 ;
console.log(j);
j = j++;
console.log(j);
为此,输出为:
0
0
由于 ++ 运算符的位置在操作数的后面,所以它的优先级低于赋值的优先级,我希望“j”首先接收自身的值(即 0),然后递增。那么为什么第二个console.log(j) 调用仍然显示“0”?
为了清楚起见,我知道解决方案是:
// 1)
j++;
// 2)
++j;
// 3)
j += 1;
// 4)
j = ++j;
但我需要知道为什么在这种特定情况下不执行增量步骤,而不是如何解决它!
【问题讨论】:
-
我认为在这里快速回答的人没有得到您的要求,我同意您的观点,这令人困惑。我也希望它是 1。
-
请注意,
j = j++是 C 和 C++ 中未定义的行为,这是有充分理由的。 -
没有理由对分配给同一变量的表达式中的变量使用一元运算符 (++)。
-
@Cruncher:在 SO 上寻找代表似乎是一个很好的理由!
-
您将 precedence 与 order of evaluation 混淆了。请记住,它们彼此之间没有任何关系。当您说
d = A() + B() * C();时,B() * C()在A()之前被评估是NOT的情况,因为乘法的优先级更高!相反,这与a = A(); b = B(); c = C(); t = b * c; d = a + t;相同。乘法发生在加法之前,但这不会改变计算 操作数 的顺序。它们是从左到右计算的。