为什么这不起作用? (Java for 循环条件部分)

Why is this not working? (Java for loop condition part)

int cnt = 0, sum = 0;
for(int i = 1; ((i <= 1000) && (i%3 == 0) && (i%5 == 0)); i++){
    if(cnt >= 5)
        break;
    System.out.println(i);
    sum += i;
    cnt++;
}
System.out.println(sum);

我想得到[1, 1000]范围内的前5个能被3整除的数字和5个数字。这段代码没有显示任何错误,但它 returns 'sum' 和 'cnt' 都是默认值(即 0),在我看来它没有进入 for 循环。

P.S。我不是高级程序员。我正在尝试这些东西只是为了探索,所以如果有人能解释这背后的真正原因。

听起来你不明白 for 循环的工作原理。 @Silvio Mayolo@experiment unit 1998X 评论了一些非常有用的链接。我鼓励您通读这些内容并熟悉它们。

在您的示例中,您的 for 循环有一个非常复杂的 header。

for(int i = 1; ((i <= 1000) && (i%3 == 0) && (i%5 == 0)); i++){

让我们把它分成几个部分。

  • for -- 这是启动for循环的关键字

  • int i = 1; -- 现在您已经在循环中创建了一个变量。它是一个名为 iint,起始值为 1

  • (the termination expression) -- 如果终止表达式returns false,则循环停止循环。让我们看看你是如何使用它的

    • i <= 1000 -- 现在你已经添加了一条规则 --> 为了让for循环执行一个循环,数字i必须小于等于至 1000。好的,这很简单,到目前为止,您现在至少有 1000 个 i 的有效值。

    • i%3 == 0 -- 现在你又增加了一条规则 --> 为了让循环执行循环,数字 i 除以时必须没有余数3. 不幸的是,这是一个问题,因为如前所述,i 的起始值为 1,并且 1/3 确实有余数 。因此,循环甚至在开始之前就停止了。

这是你的问题。如果您想检查并查看是否 i%3 == 0,则不应将该检查放在 终止表达式 中。它应该进入 for 循环中的封闭块内部。这同样适用于 i%5 == 0.

这里有一个可运行的例子来帮助你理解。

public class SOQ_20220516
{

   public static void main(String[] args)
   {
   
      int cnt = 0;
      int sum = 0;
   
      for(int i = 1; i <= 1000; i++)
      {
         if(cnt >= 5)
         {
            break;
         }
      
         if ((i%3 == 0) && (i%5 == 0))
         {
         
            System.out.println(i);
            sum += i;
            cnt++;
         
         }
      }
   
      System.out.println(sum);
      System.out.println(cnt);
   
   }

}

public class SOQ_20220516 {

public static void main(String[] args) {

  int cnt = 0;
  int sum = 0;

  for(int i = 1; i <= 1000; i++)
  {
     if(cnt >= 5)
     {
        break;
     }
  
     if ((i%3 == 0) && (i%5 == 0))
     {
     
        System.out.println(i);
        sum += i;
        cnt++;
     
     }
  }

  System.out.println(sum);
  System.out.println(cnt);

}

}

Blockquote