【问题标题】:java For loop simple code - output clarificationjava For循环简单代码——输出说明
【发布时间】:2012-12-20 15:37:51
【问题描述】:

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

    }
}

【问题讨论】:

  • 你知道 ++x 是做什么的吗?
  • 你的预期输出是什么?
  • 接收输出是8 2。我想解释一下,它来了:)
  • 谢谢大家....终于明白了...:)
  • 以及如何编写代码的一个非常糟糕的示例!我看到很多这样的问题被问到,但是任何以写代码为生的人都不应该写这样的代码。是的,你可以弄清楚它的作用,但很容易误解,或者如果你想改变它,它最终会出错。

标签: java for-loop


【解决方案1】:

在第0、1次迭代中,条件不成立,所以以x=2, y=2结束。

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

【讨论】:

  • 因此,在 OR 逻辑语句检查中,如果第一个条件为 TRUE,则始终不评估第二个条件?
  • @AciniSamuditha 是的,就是这样 :)
  • @TheCat 尽管相似,||| 是完全不同的操作。这就像比较 ||+
  • @achini 是真的.. 如果 ||只有 && 。即如果 first 为真,则它在 || 中为真如果 first 是假的,那么它在 &&. 中是假的。但它不在 |或 & ..
【解决方案2】:

++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

【讨论】:

  • @AaronDigulla 哈哈,是的,我的错……检查了它
  • 是的。但是你能解释一下最终输出是如何变成 8 2 的吗?我觉得,由于这里的两个条件(CHECK IF 1>2 || 1>2)都是错误的,所以它不会执行 X++,对吧?,
  • @AciniSamuditha 遵循相同的评估,你会得到最终结果.. 像我解释的那样进一步分解
  • 您错过了,在 an 或 || 中,只有在第一个表达式为 false 时才会计算第二个表达式。这就是y 保持在2 的原因;当++x&gt;2 为真时,++y&gt;2 未被检查,因此y 的增量不会超过 2。
  • @SJuan76 这是一个复制粘贴错误..刚刚编辑了我的代码:)
【解决方案3】:

这完全取决于您如何在 if 检查中使用 ++x/++y。遵循逻辑:

x=0 y=0 z=0

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

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 不执行,因为在 if 中 OR 为真。现在的值是:

x=4,y=2,z=2

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

【讨论】:

    【解决方案4】:

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

    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;
            }
        }
    }
    

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

    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
        ...
    }
    

    【讨论】:

      【解决方案5】:

      循环的初始执行

      z=0 --&gt; x=1, y=1

      z=1 --&gt; x=2, y=2

      如上,if中的条件为假。

      另外,请注意,对于 if 中条件的每一次有效执行,x 都会增加 2(前置增量和后置增量)。

      为什么 y=2 保持不变..?逻辑运算符“||”执行,如果第一个条件为真,它不会寻找或执行另一个条件

      z=2 --&gt; x=4, y=2

      z=3 --&gt; x=6, y=2

      z=4 --&gt; x=8, y=2

      x=8 --- 和 y=2

      【讨论】:

        【解决方案6】:

        在这样的“if”语句中:

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

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

        详细: 循环执行 5 次。

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

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

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

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

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            由于 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。

            【讨论】:

            • 但最终答案是 8 2。不是 8 5 :(
            • 哦等等 - 这是因为短路逻辑。
            • tnx 全部。我理解了这个理论
            猜你喜欢
            • 1970-01-01
            • 2017-05-03
            • 1970-01-01
            • 2012-08-12
            • 1970-01-01
            • 2017-10-09
            • 2021-11-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多