我是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循环总是假设执行其中的所有内容?
感谢并抱歉这个非常新手的问题,但它让我疯了!
答案 0 :(得分:4)
在编程中,每个语句都有一个运行的范围块。 默认情况下,for循环只有一个语句范围。如果我们想在for循环范围中运行多个语句,那么我们使用花括号{}来定义代码块。
在你的情况下,你需要使用像这样的花括号来运行这两个语句。
for (j = 1; j <= i; j++)
{
Console.Write("{0}", i);
Console.Write("\n");
}
在所有条件和循环结构中使用大括号{}的最佳编程实践。它易于阅读和理解代码。
答案 1 :(得分: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循环之外声明了迭代器,则可以在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 :(得分: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循环中执行,那么您也可以使用标签缩进它,如代码段中所示。