我已经编码多年了,突然陷入了有关运算符优先级的一些简单的事情。
根据https://developer.mozilla.org/en-us/docs/web/javascript/reference/poerators/operator/operator_precedence postfix 增量/减少的优先级高于 prefix 一个。所以,我希望在表达中
x = --a + a++;
增量将首先和之后才能计算出降低。但是,在测试中,此表达式计算从左到右,就像操作员具有相同的优先级。结果 a=1;x = --a + a++
等于0而不是2。
好的。假设前缀/后缀操作员具有相同的优先级,我尝试用括号重新排序:
a=1;x = --a + ( a++ )
,但再次,结果将为0,而不是我预期的2。
有人可以解释一下吗?为什么这里的括号不会影响任何东西?我怎么能看到后缀比前缀更高?
在表达式中,评估进行这样的进行:
- 评估
-
--a
。变量a
被减少,因此--a
的值为0
。
评估 -
a++
。获得a
的值,然后然后a
会增加。因此,a++
的值为0
。 - 执行
+
操作,结果是0
。 -
a
的最终值是1
。
因为--a
和a++
位于较低表格的+
操作员的两侧,因此提出前和收入后的优先级差异无关紧要;+
操作员在评估右手子表达之前评估左侧的子表达。
操作员优先级与评估顺序不同。
操作员的优先级告诉您
f() + g() * h()
被解析为
f() + (g() * h())
(因为*
具有比+
更高的优先级(,但没有首先称为哪个函数。这是由评估顺序控制的,在JavaScript中始终是从左到右的。
括号仅覆盖优先级(即它们会影响子表达的分组方式(,而不是评估顺序:
(f() + g()) * h()
在乘法之前执行添加,但是在所有情况下f
均为首先称为h
。
在您的示例中
--a + a++
前缀--
和Postfix ++
的相对优先级并不重要,因为它们没有附加到同一操作数上。Infix +
的优先级要低得多,因此该表达式解析为
(--a) + (a++)
与往常一样,从左到右评估JS表达式,因此--a
首先完成。
如果您已经写了
--a++
本来可以解析为
--(a++)
(而不是(--a)++
(,因为后缀++
具有更高的优先级,但是差异在这里无关紧要,因为这两个版本都是错误的:您不能增加/减少另一个增量/减少操作的结果。
但是,在操作员优先表中,您可以看到所有前缀操作员都具有相同的优先级,因此我们可以显示一个替代方案:
// ! has the same precedence as prefix ++
!a++
是有效的代码,因为由于后缀++
具有比!
更高的优先级,因此将其解析为!(a++)
。如果没有,它将被解释为(!a)++
,这是一个错误。
好吧,这很奇怪,但是看起来像函数调用之类的表达式中的增量/降低表现不像运算符。我找不到有关表达式评估顺序评估的任何文档,但看起来它忽略了任何优先规则。如此奇怪的表达:
console.log(1) + console.log(2)* ( console.log(3) + console.log(4))
将在控制台中显示1234。我能找到唯一的解释,为什么括号不会影响表达式中DEC/INC的评估顺序