当前位置: 首页 > 面试题库 >

后增量运算符未在for循环中增量

谭琛
2023-03-14
问题内容

我正在做一些有关Java的研究,发现这很令人困惑:

for (int i = 0; i < 10; i = i++) {
  System.err.print("hoo... ");
}

这是永无止境的循环!

有人很好地解释了为什么会发生这种事情吗?


问题答案:
for (int i = 0; i < 10; i = i++) {

上面的循环与以下内容基本相同:-

for (int i = 0; i < 10; i = i) {

3 次你的一部分for声明- i = i++,被评估为: -

int oldValue = i; 
i = i + 1;
i = oldValue;  // 3rd Step

您需要从此处删除分配,以使其起作用:-

for (int i = 0; i < 10; i++) {

(根据评论的OP请求)

的行为x = 1; x = x++ + x++;:-

就注释中指定的问题而言,以下表达式的结果:-

x = 1; 
x = x++ + x++;

获得如下:-

让我们标记第二条语句的不同部分:-

x = x++ + x++;
R    A     B

现在,首先(A + B)将评估RHS部分,然后将最终结果分配给x。因此,让我们继续前进。

首先A评估:-

old1 = x;  // `old1 becomes 1`
x = x + 1; // Increment `x`. `x becomes 2`
//x = old1; // This will not be done. As the value has not been assigned back yet.

现在,由于此处未完成Ato 的分配R,因此不会执行第三步。

现在,进行B评估:-

old2 = x;  // old2 becomes 2. (Since `x` is 2, from the evaluation of `A`)
x = x + 1; // increment `x`. `x becomes 3`.
// x = old2; // This will again not be done here.

现在,要获取的值x++ + x++,我们需要完成在A和的求值中剩下的最后一个赋值B,因为现在是在中赋值x。为此,我们需要替换:-

A --> old1
B --> old2   // The last assignment of both the evaluation. (A and B)

/** See Break up `x = old1;` towards the end, to understand how it's equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/

因此x = x++ + x++,变为:-

x = old1 + old2;
  = 1 + 2;
  = 3;  // Hence the answer

将的第3部分分解x = x++x = x++ + x++以防万一:

想知道为什么更换完成作为A --> old1和不x --> old1作为的情况下x = x++

深入研究x = x++零件,特别是最后一个作业:-

x = oldValue;

如果您认为x++A这里,则可以将以上分配分为以下步骤:-

A = oldValue;
x = A;

现在,对于当前问题,它与:-

A = old1;
B = old2;
x = A + B;

我希望这一点很清楚。



 类似资料:
  • 问题内容: 当我运行以下示例时,我得到输出0,2,1 我不明白为什么输出是0,2,1而不是0,2,2 问题答案: 意思是现在。调用打印,但返回0,所以和 在此之前,现在想象被调用并替换为0 所以 现在它将是 用简单的话(从这里 @ Piotr) “ i = i ++”大致翻译为 另一个这样的例子: 同样的基本原理

  • 增量运算符++将1添加到其操作数,减量运算符 - 从其操作数中减去1。 因此 - x = x+1; is the same as x++; 同样 - x = x-1; is the same as x--; 递增和递减运算符都可以在操作数之前(前缀)或后跟(后缀)。 例如 - x = x+1; can be written as ++x; // prefix form 或者 - x++; /

  • 循环中的和有区别吗?这仅仅是语法问题吗?

  • 所以这可能是一个愚蠢的问题,但我时不时地遇到这种语法错误,似乎无法吸取教训-因为我根本不明白为什么这不起作用。 由于某种原因,三元运算符不能处理增量或减量。 在控制台中,我发现了这些结果: 在搜索答案时,我发现另一个用户对意外行为有同样的体验。 经过更多的搜索,我发现前增量工作正常: 在试图确定预增量的工作原理时,遇到了这个答案。 这让我明白了为什么它能工作,而后增量不能。我想,如果三进制的操作顺

  • 问题内容: 我不明白为什么这个职位增加方程不增加。我以为在+=操作之后,该值将增加1,然后围绕i的第二次将具有1值。但是输出是一个零零的无限循环。有谁能解释为什么“ i”不增加。 问题答案: @ njzk2的答案是正确的,但指出正确的 原因 很有用。 还有其他可能性-例如,为什么Java在分配后不执行postincrement运算符?(答案:因为那不是Java语言设计者选择的) Java语言规范第

  • 问题内容: 我正在从Java切换到C ,并且想知道C 是否包含我在Java中使用的增强的for循环,例如: 在C ++中是否可能有相同的“快捷方式”? 问题答案: 在C ++ 11中,如果编译器支持,则可以。这称为基于范围的。 它适用于C样式数组以及具有函数并返回迭代器的任何类型。例: