我不明白为什么我的嵌套 for 循环有效

I don't understand why my nested for loop works

objective是根据定义的行数和列数在canvas上绘制若干个正方形:

int squareSize = 20;
int distance = squareSize + 10;
int numberofRows = 8;
int numberofColumns = 10;

for (int rows = 0; rows < numberofRows; rows++)
{

    for(int columns = 0; columns < numberofColumns ; columns++)
     {
        square(30 + (distance * rows), 30 + (distance * columns), squareSize);

     }
}

当行数小于列数时,程序如何仍然执行内部 for() 循环中的代码,这让我很困惑。我以为我遇到了问题,因为据我所知,只有当外循环被证明是真的时,内循环才会被读取和执行(所以在这种情况下,程序将停止工作时的数量达到8。)

...然而,当我插入的行数少于列数时,程序仍会给出预期的结果。这是为什么? 编辑:英语不是我的第一语言,所以我在问题中犯了一个非常愚蠢的错误。显然,我的问题是当行数 低于 时代码是如何执行的。我相应地编辑了 post。

每次执行主循环时,内部循环将执行 numberofColumns 次。 所以主循环将执行 numberofRows 次,因此内循环将执行 numberofColumns*numberofRows

您需要慢慢阅读您的代码。如前所述,两个环路彼此分离。另外用变量值替换变量可能有助于理解:

for (int i= 0; i< 8; i++)
{

    for(int j = 0; j< 10; j++)
     {
        square(30 + (30* i), 30 + (30* j), 20);

     }

}

如您所见,首先使用 i=0 j=0 调用 square 函数,然后是:

square(30,30,20).
Then i=0, j=1
square(30,60,20)
Then i=0 j=2
square(30,90,20).
...
i=0 j=10
square(30,330,20)
Then the inner for reached the maximum and then you come again to your outer loop and add one to i. 
i=1 j=0 
square(60,30,20)
i=1 j=1
square(60,60,20)
...
i=1 j=10
square(60,330,20)
...

继续做这个练习直到 i=8 和 j=10 的最大值。

square(240,330,20)

所有这些平方函数都将按照这些参数的特定顺序调用。如果您想进一步了解,请说明此平方函数的作用。

此致。

Bandolero 的回答很棒 (+1) !

这是草图的注释版本,将每个迭代步骤可视化为动画帧:

int squareSize = 20;
int distance = squareSize + 10;
int numberOfRows = 8;
int numberOfColumns = 10;

int rows;
int columns;
// do we still need to iterate through rows or columns or are we done ?
boolean isUpdating = true;

void setup(){
  size(290, 350);
  frameRate(3);
  reset();
}

void reset(){
  background(255);
  rows = 0;
  columns = 0;
  isUpdating = true;
}

void draw(){
  
  if(isUpdating){
    // render each square
    fill(255);
    float x = 30 + (distance * rows);
    float y = 30 + (distance * columns);
    square(x, y, squareSize);
    // render rows, columns values
    fill(0);
    text(rows + "," + columns, x, y + squareSize * 0.75);
    
    // increment each row
    rows++;
    // if the end of a row is reached, reset the row count and increment the column count
    if(rows >= numberOfRows){
      rows = 0;
      columns++;
    }
    // if we completed columns we're done
    if(columns >= numberOfColumns){
      isUpdating = false;
    }
    
    println("rows=", rows, "/", numberOfRows, "columns=", columns, "/", numberOfColumns);
  }
}

void keyPressed(){
  if(key == ' '){
    reset(); 
  }
  if(key == 'r'){
    numberOfRows--;
  }
  if(key == 'R'){
    numberOfRows++;
  }
  if(key == 'c'){
    numberOfColumns--;
  }
  if(key == 'C'){
    numberOfColumns++;
  }
}

本质上,它不是在一帧中使用 for,而是使用每个新帧来递增。

随意将 frameRate() 更改为更快或更慢的内容,并使用 SPACE 键重置动画(以及 c/C 到 decrease/increase columnsr/R 到 decrease/increase 行)