循环跳过一行

4

我非常新手,对C#和编程一窍不通。在下个月上学之前,我正在尝试做一些在线练习,以熟悉这种语言的基础知识。

我写了一个超级简单的程序,但我就是不明白它为什么会这样做,也找不到任何答案。以下是代码:

        int i, j, rows;

        Console.Write("\n\n");
        Console.Write("Display the pattern like right angle triangle which repeat a number in a row:\n");
        Console.Write("-------------------------------------------------------------------------------");
        Console.Write("\n\n");

        Console.Write("Input number of rows : ");
        rows = Convert.ToInt32(Console.ReadLine());
        for (i = 1; i <= rows; i++)
        {
            for (j = 1; j <= i; j++)
                Console.Write("{0}", i);
                Console.Write("\n");

        }

这个程序只做一个简单的金字塔,数字相同。
我的问题是在第二个for循环中它写了 i ,但然后它重新评估了 j++j<= 而不是写入 \n 直到最后一次循环结束。我不明白为什么?这个程序可以工作,但我不理解为什么。难道for循环不总是执行其中的所有内容,除非你打破它吗?
谢谢和抱歉问这种非常初级的问题,但这让我发疯!

3
这不是Python,缩进并不重要。如果想一起执行,请用大括号括起你内部循环下的两行代码使它们成为循环体。否则,循环体只能是一个语句。按照现在的写法,第二个Console.Write适用于i而不是j。 - Anthony Pegram
2
@AlexJolig请不要编辑问题中的代码,特别是当你在“修复”问题核心错误时。原帖作者显然对缩进有些困惑,而你的“修复”完全破坏了整个问答流程。 - Kirk Woll
@KirkWoll 好的! - Ghasem
1
缩进与问题无关。问题是关于for循环的,而不是如何在堆栈溢出上格式化代码。 - Rabid Penguin
2
@RabidPenguin,无论如何,原帖的格式对于传达他对代码逻辑的理解非常重要。 - Kirk Woll
显示剩余10条评论
3个回答

4
在编程中,每个语句都有一个作用域块,在其中运行。 默认情况下,for循环只有一个语句作用域,紧随其后。如果我们想要在for循环作用域中运行多个语句,则使用花括号{}来定义代码块。
在您的情况下,您需要像这样使用花括号来运行两个语句。
for (j = 1; j <= i; j++)
{
   Console.Write("{0}", i);
   Console.Write("\n");
}

在所有的条件和循环结构中使用花括号{}是最佳的编程实践。它使代码易读易懂。


3

一个for循环会执行其作用域内的所有内容。如果没有使用{ },for循环的作用域就是它下一行的内容。要执行多个命令,需要将它们放在花括号中,就像这样:

for (j = 1; j <= i; j++)
{
    Console.Write("{0}", i);
    Console.Write("\n");
}

通常为了可读性和方便更新循环,最好始终使用{ }。虽然你可以像这样编写for循环,并且它也非常易读。
for (i = 1; i <= rows; i++)
for (j = 1; j <= i; j++)
{
    Console.Write("{0}", i);
    Console.Write("\n");
}

上述代码将保持第二个for循环在第一个循环的范围内执行相同的操作。

顺便说一下,我注意到你在for循环外声明了变量,作为初学者,你可能不知道for循环的某些特性。

你可以在for循环中直接声明迭代器:

for (int i = 1; i <= rows; ++i)

在大多数情况下,最好像这样在for循环中声明您的迭代器,因为它使“i”具有与for循环相同的范围。
另一个循环的巧妙特性是分号之间的所有选项实际上都是可选的。因此,例如,如果您在for循环外部声明了迭代器,则可以在for循环中省略它。
int i = 1;
for (; i<= rows; ++i)

您可以省略其中的任何一个部分,甚至全部省略:

for (;;) // a perfectly valid for loop that will loop forever.

您甚至可以拥有多个迭代器:

for (int i = 0, j = 0; i < 5; ++i, ++j)

2

你期望每次内部的 for 循环迭代时,两个 Console.Write 语句都会被执行,这是错误的:

for (j = 1; j <= i; j++)
    Console.Write("{0}", i); //inner for loop scope starts and ends on this statement

内部for循环后面没有花括号。因此,默认情况下,仅在for语句后遇到的第一条语句将被视为内部for循环的作用域。

外部for循环有一个花括号,如下所示:

for (i = 1; i <= rows; i++)
{//outer for loop scope starts here
    for (j = 1; j <= i; j++)
        Console.Write("{0}", i);
    Console.Write("\n");
}//outer for loop scope ends here

所以在外层 for 循环的每次迭代中,整个内部 for 循环和 Console.Write("\n"); 都会被执行。

作为一般惯例,如果你在 for 循环中只有一个语句需要执行,那么你应该像你代码片段所示的那样用一个制表符缩进它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接