嵌套 for 循环在 C# 中如何工作

问题描述 投票:0回答:5

我不确定这段代码是如何编译的(使用 Visual Studio 代码仅供参考)

int i,j;

for(i=0; i<=6; i++) {

    for (j=1; j<=7-i; j++) {

        Console.Write("*");

    }
    Console.Write("\n"); 
 }

我的问题是,当代码开始编译时,第一个 for 循环 被测试,它将为 true,然后嵌套的 for 循环 被测试,它将为 true,所以 "Console.Write(" * "); 被写入。但是从这里我不明白发生了什么或为什么会发生。编译器然后运行 Console.Write(" "); 或...

c# for-loop nested-loops
5个回答
3
投票

如果您不理解 for 循环,您可以随时将其简化为更简单的语句:

for ( init ; condition; increment )
    body;

只是一种较短的书写方式

init;
while (condition)
{
    body;
    increment;
}

所以你的循环

for(i=0; i<=6; i++) {
  for (j=1; j<=7-i; j++) {
    Console.Write("*");
  }
  Console.Write("\n"); 
}

只是一种简短的写法

i = 0;
while (i <= 6)
{
  j = 1;
  while (j <= 7 - i)
  {
    Console.Write("*");
    j++;
  }
  Console.Write("\n");
  i++;
}

这样是不是更清楚了?

如果仍然不清楚,您可以进一步降低它。

while(condition)
  body

只是一种简短的书写方式

START:
if (!condition)
  goto END;
body;
goto START;
END:

所以你的循环就是:

i = 0;
START_1:
if (!(i <= 6)) 
  goto END_1;
j = 1;
START_2:
if (!(j <= 7 - i)) 
  goto END_2;
Console.Write("*");
j++;
goto START_2;
END_2:
Console.Write("\n");
i++;
goto START_1;
END_1:

现在清楚了吗?


1
投票

变量像这样变化。

i = 0 : j changes from 0 to 7 ( 7- i, but i = 0)
i = 1 : j changes from 0 to 6 (7 - i, i = 1)
.
.
.
.
i = 6: j changes from 1 to 1 (7 - i, i = 6)

在每个 i 循环中,您将打印 j 循环和新行字符。

|j-loop|i-loop|
|******|'\n'  |

因此,您将得到输出,

******* 
****** 
*****
****
***
**
*

1
投票

我不会仅仅向您展示输出,因为您的问题不是输出是什么,而是

for
循环如何工作。

让我们一步步进行。这是一些伪代码:

for ( init; condition; increment )
{
      Console.Write("*");
}
  1. 首先执行
    init
    ,遇到循环时只执行一次。对于
    for
    循环来说,只有一次是正确的。
  2. 评估
    condition
    。如果为真,则主体被处决。所以
    Console.Write("*");
    被执行。
  3. increment
    被执行。
  4. 再次评估
    condition
    。如果为真,则主体被处决。所以
    Console.Write("*");
    被执行。

执行步骤 3 和 4,直到

condition
为 false。一旦为 false,循环就会退出并执行以下代码行。

在你的问题中,你有一个循环,如果条件为真,它将启动另一个循环。该循环从 1 开始,如果

i
为 0,则从 7 中减去它,7 - 0 为 7,并且由于
j
为 0 且小于 7,因此它执行主体并打印 *。它继续执行步骤 3 和 4,并打印 * 七次。然后条件为假,因此它跳出内循环并打印新行。

然后外循环执行步骤3和4。

它会一直这样做,直到外循环中的条件评估为 false。


0
投票

i: 0
j: 1 to 7
打印
*
,然后打印
\n

i: 1
j: 1 to 6
打印
*
,然后打印
\n
等等


0
投票

Console.Write("\n");
只是确保它进入下一行,如果你不确定什么东西会尝试删除它,这是 Console.Write(" 的替代方案) ") 正在使用
Console.WriteLine();

© www.soinside.com 2019 - 2024. All rights reserved.