JavaScript运算符优先算法

JavaScript运算符优先算法,javascript,Javascript,我举一个例子: let x = 4 console.log(x++ + ++x + x--) 它返回16,但我不明白如何返回。 如果我们看一下,有一个运算符优先表。 所以有这样一个优先顺序: 后缀增量 后缀减量 前缀增量 加成 使用此逻辑,它应该返回14 x++=4-(5)->记住下次通话 x--=5-(4)->记住下次通话 ++x=5 + 4+5+5=14 有人能解释一下运算符解析器算法如何处理一元运算符和二元运算符吗?一旦应用了运算符优先级,分组如下所示: ((x++) + (++x))

我举一个例子:

let x = 4
console.log(x++ + ++x + x--)
它返回
16
,但我不明白如何返回。 如果我们看一下,有一个运算符优先表。 所以有这样一个优先顺序:

  • 后缀增量
  • 后缀减量
  • 前缀增量
  • 加成
  • 使用此逻辑,它应该返回
    14

  • x++
    =4-(5)->记住下次通话
  • x--
    =5-(4)->记住下次通话
  • ++x
    =5
  • +
  • 4+5+5=14


    有人能解释一下运算符解析器算法如何处理一元运算符和二元运算符吗?

    一旦应用了运算符优先级,分组如下所示:

    ((x++) + (++x)) + (x--)
    
    解释器将从左到右计算两个
    +
    s,并在遇到内部表达式时解析它们。增量/减量不会立即在
    +
    s之前运行-它们仅在解释器确定需要对其表达式求值时运行。这就是发生的情况,顺序如下:

    x is 4
    ((x++) + (++x)) + (x--)
    
    
    evaluate postfix increment: insert 4, x increases to 5
    (4 + (++x)) + (x--)
    
    
    evaluate prefix increment: x increases to 6, insert 6
    (4 + 6) + (x--)
    
    simplify:
    10 + (x--)
    
    
    evaluate postfix decrement: insert 6, x decreases to 5
    10 + 6
    

    最终值为16。

    应用运算符优先级后,分组如下所示:

    ((x++) + (++x)) + (x--)
    
    解释器将从左到右计算两个
    +
    s,并在遇到内部表达式时解析它们。增量/减量不会立即在
    +
    s之前运行-它们仅在解释器确定需要对其表达式求值时运行。这就是发生的情况,顺序如下:

    x is 4
    ((x++) + (++x)) + (x--)
    
    
    evaluate postfix increment: insert 4, x increases to 5
    (4 + (++x)) + (x--)
    
    
    evaluate prefix increment: x increases to 6, insert 6
    (4 + 6) + (x--)
    
    simplify:
    10 + (x--)
    
    
    evaluate postfix decrement: insert 6, x decreases to 5
    10 + 6
    

    最终值为16。

    您可以使用一个值表,一个用于
    x
    ,其中包含实际值/后值或前值和实际值

    然后根据opperends的顺序获取值并添加该值

    let x = 4
    console.log(x++ + ++x + x--); // 16
                post  pre   post  increment
    x           4 5   5 6   6 5   different values
    value       4       6   6     values for addition
    
    设x=4
    
    console.log(x+++++x+x--);//16
    您可以用一个表来表示值,一个表用于表示实际值/后值或前值和实际值

    然后根据opperends的顺序获取值并添加该值

    let x = 4
    console.log(x++ + ++x + x--); // 16
                post  pre   post  increment
    x           4 5   5 6   6 5   different values
    value       4       6   6     values for addition
    
    设x=4
    
    console.log(x+++++x+x--);//16
    顺序完全一致。您正在从左向右求值并应用优先级。我将按步骤进行分解:

    1.增量后
    x++
    //x=4
    x++++++x+x--
    ^^^
    |
    -->表达式=4
    -->x=5
    
    首先,我们评估
    x++
    。后缀增量比加法具有更高的优先级,因此我们必须首先解决它。此表达式产生
    4
    (当时
    x
    的值),但是
    x
    的值也会增加,以便将来读取

    2.增量前
    ++x
    //x=5
    4+++x+x--
    ^^^
    |
    -->x=6
    -->表达式=5
    
    接下来计算
    ++x
    ,因为前缀增量的优先级也高于加法,所以我们必须在表达式
    a+b
    之前解决它。我们现在还不关心
    x--
    ,因为我们还没有做到这一点

    因此,前缀增量将
    x
    的值从
    5
    增加到
    6
    ,然后返回该新值

    3.添加
    (x++)+(++x)
    //x=6
    4+6+x--
    ^^^^^
    |
    -->表达式=10
    
    我们已经解析了更高优先级的表达式,现在是添加的时候了。这很简单
    4+6=10

    4.后减量
    x--
    //x=6
    10+x--
    ^^^
    |
    -->表达式=6
    -->x=5
    
    我们到达了另一个
    a+b
    构造,但是后缀减量
    x--
    的优先级更高,所以我们首先解决这个问题。
    x
    的当前值是
    6
    ,我们返回该值,然后将
    x
    递减为
    5

    5.添加
    ((x++)+(++x))+(x--)
    //x=5
    10 + 6
    ^^^^^^
    |
    -->表达式=16
    

    最后,在所有具有更高优先级的内容之后,解决了另一个简单的加法:
    10+6=16

    顺序完全一致。您正在从左向右求值并应用优先级。我将按步骤进行分解:

    1.增量后
    x++
    //x=4
    x++++++x+x--
    ^^^
    |
    -->表达式=4
    -->x=5
    
    首先,我们评估
    x++
    。后缀增量比加法具有更高的优先级,因此我们必须首先解决它。此表达式产生
    4
    (当时
    x
    的值),但是
    x
    的值也会增加,以便将来读取

    2.增量前
    ++x
    //x=5
    4+++x+x--
    ^^^
    |
    -->x=6
    -->表达式=5
    
    接下来计算
    ++x
    ,因为前缀增量的优先级也高于加法,所以我们必须在表达式
    a+b
    之前解决它。我们现在还不关心
    x--
    ,因为我们还没有做到这一点

    因此,前缀增量将
    x
    的值从
    5
    增加到
    6
    ,然后返回该新值

    3.添加
    (x++)+(++x)
    //x=6
    4+6+x--
    ^^^^^
    |
    -->表达式=10
    
    我们已经解析了更高优先级的表达式,现在是添加的时候了。这很简单
    4+6=10

    4.后减量
    x--
    //x=6
    10+x--
    ^^^
    |
    -->表达式=6
    -->x=5
    
    我们到达了另一个
    a+b
    构造,但是后缀减量
    x--
    的优先级更高,所以我们首先解决这个问题。
    x
    的当前值是
    6
    ,我们返回该值,然后将
    x
    递减为
    5

    5.添加
    ((x++)+(++x))+(x--)
    //x=5
    10 + 6
    ^^^^^^
    |
    -->表达式=16
    
    最后,在所有具有更高优先级的内容之后,解决了另一个简单的加法:
    10+6=16