为什么第二个循环没有初始化?为什么打印出五颗星?

时间:2015-07-30 16:13:55

标签: c for-loop

该程序产生此输出:

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

以下是代码:

#include  <stdio.h>
int main(void)
{
 int i, j;
 for (i = 1; i <= 5; i++)
 {
  for (j = 1; j < i;j++)
   printf(" ");
  for (; j <= 8 - i;j++)
   printf("*");
  printf("\n");
 }
 return 0;
}

for (; j <= 8 - i;j++)的含义是什么?没有初始化步骤,也不理解为什么第二行只有五个*。

7 个答案:

答案 0 :(得分:4)

For循环实际上不需要有初始化语句。许多循环选择包含一个,但它不是绝对必要的。因此,您可以将该循环视为&#34;我们不需要在此处执行任何特殊操作以进行初始化。&#34;

至于为什么第二行有五颗星,让我们来看看这部分代码:

for (j = 1; j < i;j++)
 printf(" ");
for (; j <= 8 - i;j++)
 printf("*");

在第二次迭代中,i等于2.当第一个循环运行时,它将打印出一个空格字符。当j < i不再为真时,循环停止运行,因此当它完成运行时,j的值将为2.因此,第二个循环将运行j = 2,3, 4,5,6,j = 7时停止。这就是你看到五颗星的原因。

希望这有帮助!

答案 1 :(得分:1)

  

for((j&lt; = 8 - i; j ++)的含义是什么?

那个取得程序中使用的j的最后一个(已知)值

答案 2 :(得分:0)

 for (; j <= 8 - i;j++)
 printf("*");

此处不需要j的初始化,因为j的值来自之前的for循环。

第一个案例i=1j=1但循环中的条件为false,j递增到2。这个值在最内层循环中运行,直到j=7

答案 3 :(得分:0)

好的,相对于for循环,j在最外面的块中被初始化,所以现在可以从所有for循环(或任何其他循环)访问j。

它使用最外面的for循环修改(递增)值。

我想你现在可以搞清楚了。

通过使用复制笔找出它并为for循环变量创建一个矩阵。

它肯定会提高你的编程技巧。

快乐编码。

你可以试试这个:

variations in for loop in C

答案 4 :(得分:0)

该循环正在使用直接位于其上方的for循环中的j变量。它的每次迭代都缩短了2次;一个从一开始,一个从一开始。这就是它如何在屏幕上集中维护文本。

因此,i=1的第一次迭代不会打印任何" "。然后,它会从*值1-7打印7 j

i=2的第二次迭代将打印一个" ",然后打印5 *,j值为2-6。

每次迭代都遵循这种模式。

答案 5 :(得分:0)

#include  <stdio.h>
int main(void)
{
 int i, j;
 for (i = 1; i <= 5; i++) **1**
 {
  for (j = 1; j < i;j++) **2**
   printf(" ");
  for (; j <= 8 - i;j++) **3**
   printf("*");
  printf("\n");
 }
 return 0;
}

您会发现变量j不需要在循环3中初始化,因为它已在循环2中初始化,并且它在本地块的范围内(j存在于循环1中,并且需要&#39;在循环2)之后初始化。

关于您的第二个查询,     考虑loop1的第二次迭代,其中i = 2。当loop2此时完成执行时,j = 2。现在考虑loop3,其中j是2(如先前建立的)并且执行直到j小于或等于8-i(8-i = 8-2 = 6)。 所以它打印出j = 2,3,4,5,6 = 5星的星。

答案 6 :(得分:0)

替换

printf("*");

通过

printf("%d", j) 

看看j的值是如何变化的。这可以解释它是如何工作的。