有人可以解释一下这段代码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.
++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
Run Code Online (Sandbox Code Playgroud)
如何理解未知的代码片段:
正确缩进代码。这对阅读代码有很大帮助,而且这是一个简单、安全的操作来习惯代码。
尝试寻找不同的方式来以更简单的方式表达相同的代码。每次更改后运行代码以确保您的更改不会破坏任何内容。
这意味着在正确的位置替换++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;
}
}
}
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)