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

Ach*_*tha 7 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);

    }
}
Run Code Online (Sandbox Code Playgroud)

SJu*_*n76 10

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

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


Per*_*ror 6

++xx预增量,您的评估将如下所示.

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
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 3

如何理解未知的代码片段:

  1. 正确缩进代码。这对阅读代码有很大帮助,而且这是一个简单、安全的操作来习惯代码。

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

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

  3. 理清嵌套/复杂的if()条件。

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
    ...
}
Run Code Online (Sandbox Code Playgroud)