2011-11-26 137 views
-1

这可能看起来很傻,但我有点困惑下面的代码:循环逻辑(JAVA)

public class Loops{ 

public static void main(String[] args) { 

    int i = 0; 
    int j = 2; 
    int k = 0; 
    boolean continue = i<j; 
    while (continue && k < 2) { 
     i++; 
     j--; 
     k++; 
    } 
    System.out.println(j); 
} 

} 

这个程序打印0,但我就是不明白为什么它不打印1.我看到它的方式,一个循环后i = j = 1。因此continue = false。所以如果任何人都可以向我解释这个背后的逻辑,我将不胜感激!

+0

继续永远不会在环路进行了更新,你确定吗? –

+0

该代码无法编译,因为“继续”是保留字,不能用作变量名称。 – ibid

+0

继续使用时要小心,它是一个用于循环的java关键字,如break –

回答

4

继续在每次循环迭代后都不会重新评估自己,因为他是在循环之外定义的。 代替,检查循环条件我<Ĵ

while (i<j && k < 2) { 
     i++; 
     j--; 
     k++; 
    } 
+0

谢谢。我现在得到它:) – Kristian

3

你的循环会被编译器优化为:

boolean continue = i<j; 
while (true && k < 2) 

最后

while (k < 2) 

所以它需要循环两次以退出

After the first loop: j == 1, k == 1 
After the second loop: j == 0, k == 2, exit now 

这是为什么最后j == 0

试试把条件while()内:

while (i<j && k < 2) 
+1

非常感谢!我现在明白了。 – Kristian

+0

@Kristian:你遇到了一个很好的案例来研究循环! – sll

2

继续只设置循环体之外,这是从来没有在循环过程进行更新。因此continue在循环开始之前设置为真,然后再次不再修改。

+0

非常感谢! Apprecaited! – Kristian

0

你只设置变量“K”的值一次,因此也在继续。您还需要重新评估循环内的条件表达式。

这就是说,我建议你不要使用'continue'作为一个易变的名字;我很确定这是许多语言中的保留字。

+0

非常感谢!不胜感激! – Kristian

0

首先,你的continue变量总是计算为true(0 < 2),所以我们可以忽略它。

第一次迭代:

  • i最终评估为1
  • j最终评估为1
  • k最终评估为1
  • 作为k < 2,我们做的另一次迭代。

第二次迭代:

  • i最终评估为2
  • j最终评估为0
  • k最终评估为2
  • 作为k == 2,我们退出循环。

然后我们打印J--其计算结果为0。