我不确定这段代码是如何编译的(使用 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(" "); 或...
如果您不理解 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:
现在清楚了吗?
变量像这样变化。
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' |
因此,您将得到输出,
*******
******
*****
****
***
**
*
我不会仅仅向您展示输出,因为您的问题不是输出是什么,而是
for
循环如何工作。
让我们一步步进行。这是一些伪代码:
for ( init; condition; increment )
{
Console.Write("*");
}
init
,遇到循环时只执行一次。对于 for
循环来说,只有一次是正确的。 condition
。如果为真,则主体被处决。所以Console.Write("*");
被执行。 increment
被执行。 condition
。如果为真,则主体被处决。所以Console.Write("*");
被执行。 执行步骤 3 和 4,直到
condition
为 false。一旦为 false,循环就会退出并执行以下代码行。
在你的问题中,你有一个循环,如果条件为真,它将启动另一个循环。该循环从 1 开始,如果
i
为 0,则从 7 中减去它,7 - 0 为 7,并且由于 j
为 0 且小于 7,因此它执行主体并打印 *。它继续执行步骤 3 和 4,并打印 * 七次。然后条件为假,因此它跳出内循环并打印新行。
然后外循环执行步骤3和4。
它会一直这样做,直到外循环中的条件评估为 false。
i: 0
,j: 1 to 7
打印*
,然后打印\n
i: 1
,j: 1 to 6
打印*
,然后打印\n
等等
Console.Write("\n");
只是确保它进入下一行,如果你不确定什么东西会尝试删除它,这是 Console.Write(" 的替代方案)
") 正在使用 Console.WriteLine();