0

提出问题“为什么在嵌套 FOR 循环中使用相同的计数变量名称有效?”已经在这个论坛上发布过,在每个嵌套循环中定义的计数变量“i”应该被视为一个新变量,其范围仅限于该循环。我们应该期望该变量的值被“i”的值擦除和覆盖“在外循环中(在控制传递给内循环之前)。但是在我的以下代码中,当控制从内循环出来时,而不是变量“i”的值为0(这是它在外循环的第一次迭代,在控制传递给内循环之前),它继续具有值 10(它在内循环的最后一次迭代中得到)。然后这个 10 增加到 11,因此外循环的条件不满意,外循环退出。

我曾期望我的程序在 10 行不同的行中水平打印数字 0 到 9 10 次。但它只打印一行并退出。

还有另一件事——如果我在外循环条件(i<=10)中使用任何大于 10 的数字,那么它会创建一个无限循环。根据我的推理,它发生是因为我在之后得到了 11 的值外循环的第一次迭代,因此如果条件 <=11 或更多,则外循环进入另一次迭代。于是 i 在内循环中再次初始化为 0,循环继续。

对不起,如果我不能很清楚地提出我的问题。我想问的是,如果我们假设这个论坛上的链接问题是正确的,那么我的内部不应该是一个不同的变量吗?为什么那么值退出内循环后 i 继续保持,而不是恢复到进入内循环时的 i 值?

#include <stdio.h>

int main()
{
    int i;

    //for (i = 0; i <= 11; i++)  Creates infinite loop if this condition is used instead
    for (i = 0; i <= 9; i++)    
    {
        for (i = 0; i <= 9; i++)
        {
            printf("%d ", i);
        }
        printf("\n");
    }
}

OUTPUT : 0 1 2 3 4 5 6 7 8 9

PS:作为第二个问题,如果我们在每个循环中使用相同的计数变量,是否不可能在 10 行不同的行中水平打印数字 0 到 9,就像我在这里所做的那样?(如果与主要问题无关,请忽略此次要问题)

4

6 回答 6

8

您链接到的答案是使用具有相同名称的不同变量,您只是使用相同的变量。

比较:

for(int i = 0; ...

到:

for(i = 0; ...

前者声明了一个名为 的新变量i,这是您嵌套循环的方式,如链接到的答案。并不是说我会(永远!)建议这样做。

正如您所注意到的,对前一种语法的支持直到 C99 才被添加到 C 中。

于 2013-04-02T14:21:19.260 回答
2

如果在每个循环中都定义了我,那么行为将与您的链接问题一样。在您的示例中,您只定义i一次,在任何循环之外,然后重用它

int i;

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

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

不一样

for(int i=0; i<=9; i++)    
{

   for(int i=0; i<=9; i++)
{
于 2013-04-02T14:21:13.530 回答
2

如果您希望每个for循环都有自己的i,则需要为每个循环单独创建i。照原样,您在两个循环之外都定义了一个 i,因此一个循环所做的修改会影响另一个循环看到的值。

int i;
for (i=0; i<10; i++) {
    int i;           /* define another i for the inner loop */
    for (i=0; i<10; i++)
        printf("%d\t", i);
    printf("\n");
}

请注意,我通常建议不要这样做——虽然编译器在不同范围内拥有两个具有相同名称的变量完全没有问题,但像这样的代码在不立即明确i引用什么时可能会混淆阅读编码。

于 2013-04-02T14:22:31.207 回答
0

我想问的是,我的内在不应该是一个不同的变量吗?

不,只有一个声明,所以只有一个变量

于 2013-04-02T14:21:30.160 回答
0

对不起 - 迟到的回应,但不禁注意到:

它“起作用”的原因是内部循环将 i 重置为零,打印并增加 i,然后返回到外部循环 - 此时 i>9,因此外部循环退出。

外循环只有一次迭代,打印的值完全由内循环确定。这不是范围的问题,而是您在内部循环中将新值重新分配给 i 的事实。

于 2013-06-10T13:28:42.363 回答
0

PS:作为第二个问题,如果我们在每个循环中使用相同的计数变量,是否不可能在 10 个不同的行中水平打印数字 0 到 9,如果我们在每个循环中使用相同的计数变量,就像我在这里所做的那样?(如果与主要问题无关,请忽略此次要问题)

当然可以,但是您的 printf 需要更复杂的格式字符串。

printf("%d ",i);

上述语句的工作原理是打印 I,紧跟一个空格,然后将托架留在打印停止的位置。

我认为您想到的效果类似于以下内容。

0
  1
    2
      3
        4
          5
            6
              7
                8
                  9

要做到这一点,您需要对 printf 语句进行一些更改,如下面的完整程序所示。

// MarchingDigits.cpp : Defines the entry point for the console application.
//

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    for ( int i = 0 ; i < 10 ; i++ )
    {
        printf ( "%*d\n", ( i > 0 ? i + 1 : i ) , i ) ;
    }   // for ( int i = 0 ; i < 10 ; i++ )

return 0;
}       // int main

该程序生成的输出如下。

0
 1
  2
   3
    4
     5
      6
       7
        8
         9

您的 printf 语句与生成此输出的语句之间存在三个根本区别。

  • 在开始 % 和结束 d 之间,我在宽度所在的位置插入了一个星号。
  • 我用换行符替换了尾随空格。
  • 在格式字符串和整数参数 i 之间,我插入了另一个参数,以三元表达式的形式 i > 0 ? i + 1 : i,实际上,如果 i 大于零,则将宽度设置为 i + 1,否则将宽度设置为 i。尽管 else 块将宽度设置为 i,恰好为零,但这是有效的,因为 printf 保证永远不会截断输出。
于 2015-03-22T22:19:28.513 回答