i = i ++和i = i + 1之间的差异

时间:2017-02-25 17:44:09

标签: javascript increment

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);
  

第一个正常工作但第二个没有。有人可以帮助我两者之间有什么区别吗?

9 个答案:

答案 0 :(得分:3)

这是因为第一个为变量赋值,而第二个返回并递增它。

a = a + 1

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

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

答案 1 :(得分:2)

Javascript增量运算符++与变量一起使用以增加它。因此alice = alice + 1;alice++是等效的。如果您使用alice = alice++;,它将保留变量的原始值。

答案 2 :(得分:2)

alice = alice + 1 是这样的:

  1. alice值(0)转换为临时变量或CPU寄存器
  2. 将1添加到temp
  3. 将温度存储在alice(1)
  4. alice = alice++的工作原理如下:

    1. 将alice value(0)带入临时变量或CPU寄存器
    2. alice增加1并将其存储在alice(即alice++
    3. 将临时变量存储在alice中(即0返回)
    4. 在所有存在后缀和前缀++的语言中,后缀表示法意味着“首先使用值,然后使用增量”,而前缀表示“增量,然后使用值”。

答案 3 :(得分:1)

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(同样也包括其他变量),即前缀增量,它将给出正确的结果。 Prefix运算符首先递增该值,然后使用该值。所以它会递增,然后将值赋给左变量。

Read here

答案 4 :(得分:1)

不要做alice = alice++; - 这确实令人困惑,而不是故意使用。你应该只做alice++;

第一个声明就是这样:

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

然后,为赋值运算符左侧的变量赋予此返回值:alice = ...,这样您就可以分配原始值,从而丢失简要的增量!

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

所以:

alice = alice++; 

基本上意味着alice = alice,然后将alice的值提高1。

鉴于:

alice = ++alice;

意味着将alice的值提高一个,并将结果分配回alice。这与写作相同:

alice = alice + 1;

答案 7 :(得分:0)

你做错了什么就在这里:

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);

希望它有所帮助。

答案 8 :(得分:0)

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

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

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

也就是说,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。