这个 for(i--;i>j;j+=2,i-=j%3) 是什么意思?

问题描述

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 循环的计数器。第二部分定义进入下一轮循环的条件,第三部分更新下一轮的计数器。

  1. 开始 for 循环 i 被 i-- 设置为 13。

    • 13 大于 2。
    • 因此打印 i = 13。
    • 通过 j+=2 更新计数器 j = 4,通过 i-=4%3 别名 i-=1 更新 i= 12。
  2. 条件 12 大于 4 已通过。

    • 因此打印 i = 12。
    • 通过 j+=2 更新计数器 j = 6 和通过 i-=6%3 别名 i-=0 更新 i= 12
  3. 条件 12 大于 6 已通过。

    • 因此打印 i = 12。
    • 通过 j+=2 更新计数器 j = 8 和通过 i-=8%3 别名 i-=2 更新 i= 10
  4. 条件 10 大于 8 已通过。

    • 因此打印 i = 10。
    • 通过 j+=2 更新计数器 j = 10,通过 i-=10%3 别名 i-=1 更新 i= 9
  5. 条件 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 后的余数)。

我建议您在纸上手动计算 ji 以满足您对这个结果的要求。