【问题标题】:Difference between i = i++ and i = i + 1i = i++ 和 i = i + 1 之间的区别
【发布时间】:2017-02-25 17:44:08
【问题描述】:

https://www.hackerrank.com/challenges/compare-the-triplets

var alice = bob = 0;
if(a0 > b0){
  alice = alice + 1;
} else if (a0 < b0) {
  bob = bob + 1;
} else if (a1 > b1) {
  alice = alice + 1;
} else if (a1 < b1) {
  bob = bob + 1;
} else if (a2 > b2) {
  alice = alice + 1;
} else if (a2 < b2) {
  bob = bob + 1;
}

console.log(alice, bob);

VS

var alice = bob = 0;
if(a0 > b0){
  alice = alice++;
  console.log(alice);
} else if (a0 < b0) {
  bob = bob++;
} else if (a1 > b1) {
  alice = alice++;
} else if (a1 < b1) {
  bob = bob++;
} else if (a2 > b2) {
  alice = alice++;
} else if (a2 < b2) {
  bob = bob++;
}

console.log(alice, bob);

第一个工作正常,但第二个没有。谁能帮我看看这两者有什么区别?

【问题讨论】:

标签: javascript increment


【解决方案1】:

这是因为第一个为变量分配了一个新值,而第二个返回并增加了它。

a = a + 1

这是一个简单的变量赋值,其中a + 1 的值被赋值给a。此行执行后,a 将加一。

a++ / ++a

这是增量运算符。它不仅将变量加 1,而且还返回其值。

  • ++a 称为预增量。它将a + 1 的值分配给a,然后返回a 的值。
  • a++ 称为后增量。它首先返回a的值,然后将a + 1赋值给a

这是您看到的错误的原因。这意味着在您的初始示例中,这就是您的代码中发生的情况:

alice = alice++; // assings the original value of alice to alice, then increments it
  console.log(alice); // still the initial value

通过预递增变量,你会得到:

alice = ++alice; // assings alice+1 to alice
  console.log(alice); // now contains the value of alice+1

【讨论】:

    【解决方案2】:

    Javascript 递增运算符++ 与变量一起单独使用以递增它。所以alice = alice + 1;alice++ 是等价的。如果你使用alice = alice++;,它只会保留变量的原始值。

    【讨论】:

      【解决方案3】:

      alice = alice + 1 像这样工作:

      1. alice 值 (0) 放入临时变量或 CPU 寄存器中
      2. 温度加 1
      3. 将温度存储在alice (1)

      alice = alice++ 是这样工作的:

      1. 将 alice 值 (0) 放入临时变量或 CPU 寄存器中
      2. alice 增加1 并将其存储在alice(即alice++)中
      3. alice中存储临时变量(即0返回)

      在所有存在后缀和前缀 ++ 的语言中,后缀表示法的意思是“先使用值,然后递增”,而前缀表示“递增,然后使用值”。

      【讨论】:

        【解决方案4】:
        alice++ is postfix increment of alice.That means that the value of alice will be first used and then incremented. So, in the second code the value is first assigned to the left variable and then incremented.
        

        如果您将代码的第二部分更改为++alice(其他变量也类似),即前缀增量,它将给出正确的结果。前缀运算符首先增加值,然后使用该值。所以它会递增,然后将值赋给左边的变量。

        Read here

        【讨论】:

          【解决方案5】:

          不要这样做alice = alice++;——这真的很令人困惑,而且不是预期的用途。你应该这样做alice++;

          这是第一个语句发生的情况:

          alice++ 增加变量alice 中的值,但返回原始值。

          然后这个返回的值被赋值给赋值运算符左边的变量:alice = ...,所以你把原来的值赋值回去,失去了短暂的增量!

          【讨论】:

            【解决方案6】:

            alice = alice++ 是一个后缀表达式。在这里,值首先分配给 alice,然后递增。看下面的例子来了解区别

            var b = 1
            a = b++            // sets a as 1 and  then increase the value of b
            console.log(a,b)   //Prints 1,2
            a = ++a            // Increases value of a by 1 and then sets a
            console.log(a)     //Prints 2
            

            【讨论】:

              【解决方案7】:

              当您使用 JavaScript “一元”运算符(接受一个操作数的运算符:即 ++ 和 --)时,您可以将它们放在表达式的开头或结尾。你把他们放在哪里决定了他们何时完成他们的工作。如果在开头,则先进行运算,然后执行表达式的其余部分,如果在结尾,则执行表达式并进行运算。这些被称为前后增量以及前后减量。

              所以:

              alice = alice++; 
              

              本质上是指alice = alice,然后将alice 的值提高1。

              鉴于:

              alice = ++alice;
              

              意味着将alice 的值增加一并将结果分配回alice。那和写一样:

              alice = alice + 1;
              

              【讨论】:

              • “本质上意味着 alice = alice 然后将 alice 的值增加 1。”是不正确的。后增量赋值会立即应用,而不是在整个表达式的末尾。
              • @user2864740 MDN 声明:"Increment (++) 自增运算符将其操作数递增(加一)并返回一个值。如果使用后缀,则运算符在操作数之后(例如, x++),则返回递增前的值。如果在操作数之前使用带运算符的前缀(例如,++x),则返回递增后的值。” 我的解释是正确的。 jsfiddle.net/54cscj06/3
              【解决方案8】:

              你做错了什么:

              variable = variable++
              

              ++ 运算符将一个整数加 1,然后保存该整数。这意味着您不必在那里写variable =

              例如,在以下代码中:

              var myVar = 0;
              myVar++;
              

              myVar的值现在是1,不需要单独声明。而且我认为++ 方法不会返回值(如果我错了,请纠正我)。

              所以你需要在第二种情况下使用这段代码:

              var alice = bob = 0;
              if(a0 > b0){
                alice++;
                console.log(alice);
              } else if (a0 < b0) {
                bob++;
              } else if (a1 > b1) {
                alice++;
              } else if (a1 < b1) {
                bob++;
              } else if (a2 > b2) {
                alice++;
              } else if (a2 < b2) {
                bob++;
              }
              

              console.log(alice, bob);

              希望对你有帮助。

              【讨论】:

              • ++ 运算符将整数加 1,然后保存整数。” 好吧,这只是故事的一部分。与其说它给值加 1,不如说它是在 表达式的其余部分完成之后执行它的事实。
              • @ScottMarcus 这是不正确的:在评估 that 表达式 (x++) 后,x++ 就会增加 x。问题是 x 的预增量值由表达式返回,然后分配 that 值,使整个操作成为 No-OP。
              【解决方案9】:

              在 JavaScript 中,表达式 x = x++ 不会改变 x 的值(如果 x 是数字1)。

              这是因为post-increment arithmetic operator 计算为当前值,然后立即用增加的值更新目标(例如x)。

              但是,由于评估 x++ 的结果是原始值,而不是现在存储在 x 中的递增值,因此最终结果是 x 具有 original 值 re -分配给它。

              x = x++在逻辑上等价于:

              // given x = 1, then
              f = x++;
              // f = 1
              // x = 2
              x = f;
              // x = 1
              

              将变量加一的语句的有用形式包括:x++(赋值是隐式的)、x += 1x = x + 1。不同之处在于x++ 的求值结果为原始值,而其他两种形式的求值结果为新值。


              1 后自增运算符总是产生数字,并根据需要进行转换。因此它可以在某些条件下改变 x 的值:例如。在x = "foo"; x = x++; 之后,x 将为 NaN。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-02-26
                • 1970-01-01
                • 2016-06-29
                • 2021-12-21
                • 1970-01-01
                • 2015-07-11
                • 2023-03-29
                相关资源
                最近更新 更多