问题描述
int i =14;
int j =2;
for(i--;i>j;j+=2,i-=j%3){
System.out.println(i + " ");
}
它返回 13,12,10 但我不明白它背后的原因!
解决方法
假设您熟悉 while 循环。您的代码与以下代码相同:
int i = 14;
int j = 2;
i -= 1;
while(i > j) {
System.out.println(i + " ");
j += 2;
i -= j % 3;
}
有关 for
循环的详细信息,请参阅 java docs。
for
循环的语法:
for (initialization; termination; increment) {
statement(s)
}
您可以提供多个初始化、终止或增量。在您的代码中,您为增量提供了多个表达式。
您可以通过创建如下所示的表格来分析您的代码,尤其是循环。您可以创建一个表,其中行表示迭代,列表示表达式,其执行顺序从左开始:
我 | j | i > j | System.out.println(i + " "); | j += 2 | i -= j % 3 |
---|---|---|---|---|---|
13 | 2 | 真实 | 13 | 4 | 12 |
12 | 4 | 真实 | 12 | 6 | 12 |
12 | 6 | 真实 | 12 | 8 | 10 |
10 | 8 | 真实 | 10 | 10 | 9 |
9 | 10 | 假 |
您应该熟悉 for 循环 第一部分正常启动 for 循环的计数器。第二部分定义进入下一轮循环的条件,第三部分更新下一轮的计数器。
-
开始 for 循环 i 被 i-- 设置为 13。
- 13 大于 2。
- 因此打印 i = 13。
- 通过 j+=2 更新计数器 j = 4,通过 i-=4%3 别名 i-=1 更新 i= 12。
-
条件 12 大于 4 已通过。
- 因此打印 i = 12。
- 通过 j+=2 更新计数器 j = 6 和通过 i-=6%3 别名 i-=0 更新 i= 12
-
条件 12 大于 6 已通过。
- 因此打印 i = 12。
- 通过 j+=2 更新计数器 j = 8 和通过 i-=8%3 别名 i-=2 更新 i= 10
-
条件 10 大于 8 已通过。
- 因此打印 i = 10。
- 通过 j+=2 更新计数器 j = 10,通过 i-=10%3 别名 i-=1 更新 i= 9
-
条件 9 大于 10 失败。
- 退出循环。
db.instructors.aggregate([{
$match: {
salary: {$gt: 75000}
}},{ $unwind: "$teaches" },{
$group:
{
_id: "$name",totalCourses:
{
$sum: 1
}
}
},{
$match: {
totalCourses: 2
}
}
]);
减少到 13 作为起始条件。 i
是继续循环的条件,所以如果 i>j
循环退出。在每次迭代中,j>=i
增加 2,j
减少 i
(这是 j%3
除以 3 后的余数)。
我建议您在纸上手动计算 j
和 i
以满足您对这个结果的要求。