有人可以解释一下此代码如何打印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);
}
}
答案 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)
如何理解未知代码:
正确缩进代码。这对于阅读代码非常有帮助,这是一个简单,安全的操作,可以习惯代码。
尝试以更简单的方式找到表达相同代码的不同方式。每次更改后运行代码,以确保您的更改不会破坏任何内容。
这意味着在正确的位置将++x
替换为x=x+1
。
解除嵌套/复杂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
...
}
答案 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