【问题标题】:Js magic need explanationjs魔法需要解释
【发布时间】:2017-02-04 06:30:30
【问题描述】:

我正在尝试用 js 解决这个魔法:

var a = 1;
console.log(a++ + ++a);

它返回4,我可以理解它是1+3,但是这个顺序是什么?

【问题讨论】:

  • 如果您了解后自增和预自增运算符的作用,那就很明显了。您只需要阅读文档并了解代码从左到右执行的知识。
  • 我有,但似乎并不明显。您能否在回答中将其描述为 1)... 2)... 3)...?
  • @Jonasw 2 + 2 与此有什么关系?
  • 如果你在现实生活中看到这样的代码,那么它是由一个可怕的人编写的。根据场景使用++aa++ 有充分的理由,但是出于任何原因连续使用5 个加号对于可读性来说是一个坏主意,并且只是要求打错字。

标签: javascript post-increment pre-increment


【解决方案1】:

这个顺序是什么

在伪规范语言中:

  1. 评估加法 (a++ + ++a)
    1. lval 为左操作数的计算结果 (a++)
      1. 获取a 的值并将其分配给oldValue。 (1)
      2. newValue 成为oldValue + 1
      3. newValue 分配给a。 (a == 2)
      4. 返回oldValue。 (1)
    2. rval 是计算右操作数的结果 (++a)
      1. 获取a 的值并将其分配给oldValue。 (2)
      2. newValue 成为oldValue + 1
      3. newValue 分配给a。 (a == 3)
      4. 返回newValue。 (3)
    3. 返回lval + rval。 (1 + 3)
  2. 结果:4

【讨论】:

    【解决方案2】:

    a++ 表示返回递增前的值

    ++a表示递增后返回值

    所以分解你的例子:

    var a = 1;
    console.log(a++ + ++a);
    
    1. a 设置为 1
    2. a++ 返回 1,然后 a 递增到 2(但我们此时不做任何事情)
    3. ++a 递增 a 并返回 3
    4. 那么我们总共有console.log(1 + 3)1 来自第 1 步,3 来自第 3 步。

    【讨论】:

      【解决方案3】:

      更详细地了解Xufox was saying in the comments section

      ++a首先增加a的值,然后返回一个引用a的左值,所以如果使用a的值,那么它将是增加的值。

      a++ 首先返回一个值为 a 的右值,即旧值,然后在下一个完整表达式之前的未指定时间(即“分号之前”)递增 a。

      后缀增量的优先级高于前缀增量。

      这在过去帮助了我很多,它也应该对你有帮助..

      http://en.cppreference.com/w/cpp/language/operator_incdec

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-23
        • 2014-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多