7

有人可以解释一下这段代码是如何打印出来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);

    }
}
4

8 回答 8

10

在迭代 0、1 中,条件不成立,因此以x=2, y=2.

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

于 2012-12-20T15:42:21.497 回答
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
于 2012-12-20T15:40:25.393 回答
4

这都是关于你如何在 if 检查中获得 ++x/++y 的。遵循逻辑:

x=0 y=0 z=0

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

x=1 y=1 z=0

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

x=2 y=2 z=1

迭代 3 发生,z=2 然后你点击 if 行,因为 ++x 是 3,它是 >2,所以 x++ 执行(使 x=4),++y 不执行,因为 OR 为真在如果。现在的值是:

x=4, y=2, z=2

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

于 2012-12-20T15:44:02.630 回答
3

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

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

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

    这意味着在正确的位置替换++xx=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;
        }
    }
}

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

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
    ...
}
于 2012-12-20T15:48:08.103 回答
1

循环的初始执行

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

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

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

此外,请注意,对于 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

于 2012-12-20T15:52:25.687 回答
1

在这样的“if”语句中:

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

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

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

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

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

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

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

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

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

于 2012-12-20T15:53:59.663 回答
0

由于 System.out.println() 语句在循环之外,所以 println 语句只运行一次。每次循环迭代,if 语句检查 x 和 y 的值是否大于 2;但是,首先它会增加它们的两个值。循环的前 3 次,条件不满足,但 x 和 y 仍然递增。之后每次 x 和 y 都加一;但是,由于满足条件,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。

于 2012-12-20T15:46:29.203 回答
0

For 循环执行 5 次。当它到达 if x 和 y 时,前 2 次相同时将增加 1。在 x&y 为 2 但不满足 if 条件时。在第三次 x 将是 3 并且它不会检查 y 所以 y 不会增加并且它会进入 if 并再次增加。所以 y 将为 2。但 x 将增加 2*2=4 倍,因此 x=8 和 y=2

于 2012-12-20T15:48:51.600 回答