【问题标题】:The += operator [closed]+= 运算符 [关闭]
【发布时间】:2013-11-22 14:35:55
【问题描述】:

我有一个关于+= 运算符的问题。 我的任务是检查 j 最后的值。现在,我已经通过 Java 运行它并获得了结果,但我并没有真正了解解决方案是如何组合在一起的。我希望有人可以向我解释它是如何建立的:

(1)

for (i = 10, j = 1; i > 0; i = i - 2)
    j += j;

解:j = 32

(2)

for (j = 0, i = 0; j < 10; j = j + i, i++)
    j += j;     

解:j = 11

(3)

for (i = 0, j = 10; i < 10 && j > 5; i++)
    j += j-- + i++;   

解:j = 372

【问题讨论】:

  • Java 还是 Javascript?选择一个并删除另一个标签
  • 把它写在纸上,自己看看。成为计算机。
  • 如果你正在写像j += j-- + i++ 这样的东西,你应该得到它带来的所有痛苦。
  • @MarcB 对 SO 的最佳评论。
  • @musefan:虽然它发生了,但在这种情况下,并不重要。但是,是的,最好不要(进一步)混淆这两种基本不相关的语言。 :-)

标签: java javascript operators


【解决方案1】:
j += j;

一样
j = j + j;

也就是说,它加到j,'+='之后的所有东西

j += j + j-- + i++;

相同
j = j + (j--) + (i++);

j = j + j + i; //the ++ adds one to i and the -- takes one from j after this statement has ran

【讨论】:

  • AFAIK j = j + (j--) + (i++); 将等于 j = j + j + i - 1(之后我被递增)
  • (j--) 在这种情况下不等于 (j - 1)。它递减 j 但返回未递减的值。
  • 我显然没注意,谢谢指正。你当然是对的。
  • 谢谢!第一个任务的解决方案不会是:j = 1 + 1 = 2 结果显示它是 32,但这个计算甚至没有带入“i”,对吧?
  • 太好了,我想我现在明白了,谢谢!
【解决方案2】:

让我们展开j += j-- + i++

  • j-- 返回 j 的值,之后 j 递减,即如果 j 为 2,则返回 2,之后 j 为 1
  • i++ 是一样的,但之后 i 递增
  • 因此j-- + i++ 产生与j + i 相同的结果(除了 j 和 i 也发生了变化)。
  • 在这些操作之后j 将递减,因此j += j-- + i++ 等于j = (j - 1) + (j + i)

注意顺序很重要,即j + j-- 产生与j + j 相同的结果,但j-- + j 的结果将是j + j - 1(因为返回j,然后递减,然后添加)。

至于您的其余代码,只需看看变量随时间的变化情况。我将扩展您的第二个作为示例:

for (j = 0, i = 0; j < 10; j = j + i, i++)
   j += j;   

循环将 j 初始化为 0,每次迭代首先将 j 加倍 (j += j) 然后加上 i 并递增 i (j = j + i, i++)。

因此迭代 1 将产生 j = 0 + 0 + 0 = 0。 (我现在是 1)
迭代 1 将产生j = 0 + 0 + 1 = 1。 (我现在 2 岁)
迭代 2 将产生 j = 1 + 1 + 2 = 4。 (我现在 3 岁)
迭代 3 将产生j = 4 + 4 + 3 = 11。 (我现在 4 岁)

【讨论】:

  • 很好的解释,非常感谢!
【解决方案3】:

+= 真的很容易理解。基本上,右手边的东西都会添加到左手边的东西上。

它可能是令人困惑的前置增量和后置增量。基本上,前增量会在值上加一,然后按优先顺序执行其他操作,而后增量将在增量之前按优先顺序执行其他操作。

例如

int i = 1;
int j = 1;
int k = 2;

i += j++ + k++; 

System.out.println("i: " + i);

/* i is 4 because it added the value of j BEFORE incrementing j(value of 1)
 * and added the value of k  *BEFORE incrementing k(value of 2) After the values 
 * have been added to i, they then become 2 and 3 respectively
 */

System.out.println("j: " + j); 

//j was one, but is now 2 because it incremented after adding its  value to i

System.out.println("k: " + k); 
//k was two, but is now 3 because it incremented after adding its value to i

i = 0; //reset i to 0 but leave k at 3, then...

i += ++k; 

System.out.println("i: " + i);

//i is now 4 because k was pre-incremented from 3 to 4 BEFORE assigning its value to i

i = 0; //reset i to 0 again
i += k++;

System.out.println("i: " + i);

//i is still 4 because k post-incremented AFTER assigning its value to i

【讨论】:

  • 感谢您的解释 :)
猜你喜欢
  • 2015-01-28
  • 2011-06-21
  • 2012-04-19
  • 1970-01-01
  • 2012-09-24
  • 2013-05-19
  • 2011-03-26
  • 2014-03-30
  • 1970-01-01
相关资源
最近更新 更多