嵌套循环混乱
Nested loop Confusion
public class Exon303 {
public static void main(String[] args) {
int k = 109;
do {
for(int i = 3; i < 9; i = i * 2) {
if(k % i ==3) {
k = k / 3;
} else {
k = k / 2;
}
}
System.out.println(k);
} while(k > 0);
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int m = 0; m < i * 2; m++) {
if(m == j && m == i) {
System.out.println("i: " + i);
System.out.println("j: " + j);
System.out.println("m: " + m);
}
}
}
}
}
}
有人可以向我解释我创建的这些循环的输出我现在已经手动跟踪了两次,出于某种原因,我在跟踪它时得到了不同的输出。
Expected output:
27
6
1
0
i: 1
j: 1
m: 1
下面是我的手写输出
Handtraced output:
54
27
9
4
2
0
i: 0
j: 0
m: 0
i: 1
j: 1
m: 1
您手动跟踪代码是错误的。让我解释一下。
将您的代码分成两部分。第一部分:
int k = 109;
do {
for(int i = 3; i < 9; i = i * 2) {
if(k % i ==3) {
k = k / 3;
} else {
k = k / 2;
}
}
System.out.println(k);
} while(k > 0);
您在 for
循环之外打印了 k
,然后每个循环 k / 2
两次 (i = 3, 6),在第一个 while
循环之后,k = (k / 2) / 2 = 27
。当 k
没有任何值使得 k % i == 3
时,下一个 while
循环是一样的。因此,每个 while
循环中的下一个 k 值是 27/4 = 6
和 6/4 = 1
。这是每个 for 循环开始时的 k, i
个值:
---- while loop ----
k = 109, i = 3
k = 54, i = 6 => print k / 2 = 27
---- while loop ----
k = 27, i = 3
k = 13, i = 6 => print k / 2 = 6
---- while loop ----
k = 6, i = 3
k = 3, i = 6 => print k / 2 = 1
---- while loop ----
k = 1, i = 3
k = 0, i = 6 => print k / 2 = 0
----> k == 0, break while loop
第二部分:
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int m = 0; m < i * 2; m++) {
if(m == j && m == i) {
System.out.println("i: " + i);
System.out.println("j: " + j);
System.out.println("m: " + m);
}
}
}
}
打印i,j,m值的条件是m == j == i
和i, j
只有2个值0, 1
,但是条件m < i*2
使得for
m
的循环在 i = 0
和 m = 0
时被忽略。所以唯一的输出:i = j = m = 1
.
public class Exon303 {
public static void main(String[] args) {
int k = 109;
do {
for(int i = 3; i < 9; i = i * 2) {
if(k % i ==3) {
k = k / 3;
} else {
k = k / 2;
}
}
System.out.println(k);
} while(k > 0);
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int m = 0; m < i * 2; m++) {
if(m == j && m == i) {
System.out.println("i: " + i);
System.out.println("j: " + j);
System.out.println("m: " + m);
}
}
}
}
}
}
有人可以向我解释我创建的这些循环的输出我现在已经手动跟踪了两次,出于某种原因,我在跟踪它时得到了不同的输出。
Expected output:
27
6
1
0
i: 1
j: 1
m: 1
下面是我的手写输出
Handtraced output:
54
27
9
4
2
0
i: 0
j: 0
m: 0
i: 1
j: 1
m: 1
您手动跟踪代码是错误的。让我解释一下。
将您的代码分成两部分。第一部分:
int k = 109;
do {
for(int i = 3; i < 9; i = i * 2) {
if(k % i ==3) {
k = k / 3;
} else {
k = k / 2;
}
}
System.out.println(k);
} while(k > 0);
您在 for
循环之外打印了 k
,然后每个循环 k / 2
两次 (i = 3, 6),在第一个 while
循环之后,k = (k / 2) / 2 = 27
。当 k
没有任何值使得 k % i == 3
时,下一个 while
循环是一样的。因此,每个 while
循环中的下一个 k 值是 27/4 = 6
和 6/4 = 1
。这是每个 for 循环开始时的 k, i
个值:
---- while loop ----
k = 109, i = 3
k = 54, i = 6 => print k / 2 = 27
---- while loop ----
k = 27, i = 3
k = 13, i = 6 => print k / 2 = 6
---- while loop ----
k = 6, i = 3
k = 3, i = 6 => print k / 2 = 1
---- while loop ----
k = 1, i = 3
k = 0, i = 6 => print k / 2 = 0
----> k == 0, break while loop
第二部分:
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int m = 0; m < i * 2; m++) {
if(m == j && m == i) {
System.out.println("i: " + i);
System.out.println("j: " + j);
System.out.println("m: " + m);
}
}
}
}
打印i,j,m值的条件是m == j == i
和i, j
只有2个值0, 1
,但是条件m < i*2
使得for
m
的循环在 i = 0
和 m = 0
时被忽略。所以唯一的输出:i = j = m = 1
.