java For循环简单代码 - 输出说明

时间:2012-12-20 15:37:51

标签: java for-loop

有人可以解释一下此代码如何打印8 2作为结果吗?

public class Check{

    public static void main(String args[]){

        int x=0;
        int y=0;

        for(int z=0;z<5;z++){
            if(++x>2||++y>2){
               x++;
            }
         }

         System.out.println(x+" "+y);

    }
}

8 个答案:

答案 0 :(得分:10)

在迭代0,1中,条件不为真,因此以x=2, y=2结束。

从迭代2开始,第一个条件++x>2为真,因此第二个条件不再被评估。 y仍然固定为2.对于每个后续循环,x会增加两次(一次评估++x>2,一次评估x++;)。所以x变成了4,6和8。

答案 1 :(得分:6)

++x x的增量,您的评估将如下所示。

INITIAL VALUES:
x=0, y=0
    z=0, 
    INVARIANT FOR z: z<5 ()
    WHEN z=0 
       CHECK IF 1>2 || 1>2
               THEN x++
     WHEN z=1
           CHECK IF 2>2 || 2>2
                THEN x++

     WHEN z=2
          CHECK IF 3>2 || 2>2 y cond is not eval as x cond satisfied
                THEN x++(inc 3++)

     WHEN z=3
          CHECK IF 5>2 || 2>2 // y cond is not eval as x cond satisfied
                THEN x++(inc 5 by 1)

     WHEN z=4
          CHECK IF 7>2 || 2>2 //y cond is not eval as x cond satisfied
                THEN x++(inc 7 by 1)


THUS : FINAL OUTPUT x= 8, y=2

答案 2 :(得分:4)

关于如何在if检查中获得++ x / ++ y的全部内容。遵循逻辑:

x = 0 y = 0 z = 0

然后你点击if行,因为++ x是1,它不是&gt; 2,所以它运行++ y部分使y = 1,if结果为false,你的值现在是:

x = 1 y = 1 z = 0

迭代2发生,z = 1 然后你点击if行,因为++ x是2它不是> 2,所以它运行++ y部分使y = 2,if结果为false,你的值现在是:

x = 2 y = 2 z = 1

迭代3发生,z = 2 然后你点击if行,因为++ x是3,它是&gt; 2,所以x ++执行(使x = 4),++ y没有执行,因为在if中OR是真的。这些值现在是:

x = 4,y = 2,z = 2

重复此操作直到z = 5,最后得到x = 8,y = 2

答案 3 :(得分:3)

如何理解未知代码:

  1. 正确缩进代码。这对于阅读代码非常有帮助,这是一个简单,安全的操作,可以习惯代码。

  2. 尝试以更简单的方式找到表达相同代码的不同方式。每次更改后运行代码,以确保您的更改不会破坏任何内容。

    这意味着在正确的位置将++x替换为x=x+1

  3. 解除嵌套/复杂if()条件。

  4. 所以重写的代码可能如下所示:

    for(int z=0; z<5; z ++) {
        x = x + 1;
        if( x > 2 ) { // first half of the OR
            x = x + 1;
        } else {
            // first half of the OR is false, we end up here
            y = y + 1; // pre increment
            if( y > 2 ) {
                x = x + 1;
            }
        }
    }
    

    另一个好的解决方案是使用穷人的调试器:

    for(int z=0; z<5; z++) {
    
        System.out.println("x="+x+", y="+y+", z="+z); // add this line in several places to see what happens
        ...
    }
    

答案 4 :(得分:1)

循环的初始执行

z=0 --> x=1, y=1

z=1 --> x=2, y=2

对于上述情况,if中的条件为false。

另外,观察,对于if中的每个有效执行条件,x增量为2(预增量和后增量)。

为什么y = 2保持不变..?逻辑运算符'||'执行,如果第一个条件为真,则不会查看或执行其他条件

z=2 --> x=4, y=2

z=3 --> x=6, y=2

z=4 --> x=8, y=2

x = 8 ---且y = 2

答案 5 :(得分:1)

在这样的'if'语句中:

if (conditionA() || conditionB()) {...}

如果conditionA()返回true,则根本不调用conditionB(),因为没有必要,整个if语句必须为true。

详细说明: 循环执行5次。

第一次:在if()语句中,x和y递增为1。

第二次:在if()语句中,x和y增加到2。

第3次:x递增到3,这足以触发'if'块内部的执行。 y不会再次递增,因为不需要在||之后计算表达式(或)如果第一部分是真的。

第4次:x递增到5,if()仍为真,所以x再次递增到6。

第5次:x在if()中增加到7,在块中增加8。

最终结果:x为8,y为2。

答案 6 :(得分:0)

由于System.out.println()语句在循环之外,因此println语句只运行一次。每次循环迭代,if语句检查x和y的值是否大于2;但是,首先它会增加两个值。通过循环的前3次,不满足条件,但x和y仍然增加。每次之后,x和y都加1;但是,由于满足条件,x会增加一个额外的时间。简而言之,这是每次迭代后x和y的样子:

z   x   y
--  --  --
0   1   1
1   2   2
2   4   3
3   6   4
4   8   5

编辑:由于if语句(||)中的短路逻辑,只有表达式的第一部分被评估,y永远不会递增。结果,y只会保持在2。

答案 7 :(得分:0)

for循环执行5次..当它到来时,如果x和y将前1次增加1,那么x&amp; y为2但if条件不满足。在第3次x将是3并且它不会检查y因此y不会增加并且如果再次增加它将进入内部。因此y将为2.但是x将增加2 * 2 = 4次,因此x = 8且y = 2