“ for”循环中的“ for”循环可以使用相同的计数器变量名称吗?

时间:2018-07-26 23:56:31

标签: c loops for-loop nested

我可以在for循环内的for循环中使用相同的计数器变量吗?

还是变量会互相影响?以下代码是否应该在第二个循环中使用其他变量,例如j,还是i很好?

for(int i = 0; i < 10; i++)
{
  for(int i = 0; i < 10; i++)
  {
  }
}

12 个答案:

答案 0 :(得分:136)

您可以使用相同的名称(标识符)。这将是一个不同的对象。它们不会互相影响。在内部循环内部,无法引用外部循环中使用的对象(除非您对此进行了特殊规定,例如通过提供指向它的指针)。

这通常是不好的风格,容易造成混乱,应该避免。

对象只有在内部对象分别定义的情况下才是不同的,就像显示的int i一样。如果使用相同的名称而不定义新对象,则循环将使用相同的对象,并且会相互干扰。

答案 1 :(得分:55)

首先,这是绝对合法的:代码将编译并运行,并重复嵌套循环的主体10×10 = 100次。嵌套循环内的循环计数器i隐藏外循环的计数器,因此这两个计数器将彼此独立地递增。

由于外部i是隐藏的,因此嵌套循环主体内的代码只能访问嵌套循环的i的值,而不能访问外部循环的i。在嵌套循环不需要访问外部i的情况下,此类代码可能是完全合理的。但是,这很可能会使读者产生更多的困惑,因此,最好避免编写此类代码以避免“维护责任”。

注意:即使两个循环的计数器变量具有相同的标识符i,它们仍然是两个自变量,即您不是使用相同的变量在两个循环中都是变量。在两个循环中使用相同的变量也是可能的,但是代码将很难阅读。这是一个示例:

for (int i = 1 ; i < 100 ; i++) {
    for ( ; i % 10 != 0 ; i++) {
        printf("%02d ", i);
    }
    printf("%d\n", i);
}

现在,两个循环都使用相同的变量。但是,需要一段时间才能弄清楚该代码的功能而不进行编译(demo);

答案 2 :(得分:25)

可以。但是您应该了解i的范围。如果我们将外部i称为i_1,将内部i称为i_2,则i的范围如下:

for(int i = 0; i < 10; i++)
{
     // i means i_1
     for(int i = 0; i < 10; i++)
     {
        // i means i_2
     }
     // i means i_1
}

您应该注意,它们不会互相影响,只是它们的定义范围不同。

答案 3 :(得分:16)

那是完全可能的,但请记住,您将无法解决  the first declared i

maximumFractionDigits

在第二个子循环内的第二个循环中

var schema = new Schema(..);
schema.pre('save', function(next) {
    // verify here
    next();
});

如果您需要调整或获取第一个i的值,请在第二个循环中使用j

for(int i = 0; i < 10; i++)//I MEAN THE ONE HERE
{

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

    }
}

如果您有足够的创造力,您可以一次完成两个任务

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

  for(int i = 0; i < 10; i++)//the new i
    {
        // i cant see the i thats before this new i here
    }
}

答案 4 :(得分:12)

是的,对于内部for循环,可以使用与外部for循环相同的计数器变量名称。

来自for loop

  

for ( init_clause ; cond_expression ; iteration_expression ) loop_statement
  用作 loop_statement 的表达式语句建立了自己的 block范围,与 init_clause 的范围不同。

for (int i = 0; ; ) {
    long i = 1;   // valid C, invalid C++
    // ...
}  

loop_statement 的范围在 init_clause 的范围内嵌套

来自C Standards#6.8.5p5迭代语句 [强调我的]

  

迭代语句是一个块,其作用域是其封闭块作用域的严格子集。 循环主体也是一个块,其作用域是迭代语句作用域的严格子集

根据C Standards#6.2.1p4标识符的范围 [强调矿井]

  

....。在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体被隐藏(并且不可见)在内部范围内。

答案 5 :(得分:9)

从代码/编译器的角度来看,这将是一件完全有效且合法的事情。在内部int i循环中声明的for(int i = 0; i < 10; i++)在新的较小范围内,因此声明shadows在外部循环中声明int i(或换句话说, :在内部作用域中,对变量i的所有访问都转到在内部作用域中声明的int i,而在外部作用域中的int i保持不变)。

也就是说,从代码质量的角度来看,这是完全可怕的。它很难阅读,难以理解并且容易被误解。不要这样做。

答案 6 :(得分:8)

是的,您可以使用相同的名称变量。

C编程变量可以在三个地方声明:
 局部变量:-在函数或块内。
 全局变量:-在所有函数中。
形式参数:-在功能参数中。

但是在您的情况下,i scope必须谨记在心

for(int i = 0; i < 10; i++)
{
     // i means 1st for loop variable
     for(int i = 0; i < 10; i++)
     {
        // but here i means 2nd for loop  variable
     }
     //interesting thing here i means 1st for loop variable
}

注意:最佳做法是对内部和外部循环使用不同的变量

答案 7 :(得分:8)

是的,您可以使用它,但是这很令人困惑。 最重要的是循环内局部变量的范围。就在函数内部声明变量而言,该变量的范围就是该函数。

int a = 5;
// scope of a that has value 5
int func(){
    int a = 10;
   // scope of a that has value 10
}
// scope of a that has value 5

与循环类似,内部循环内部声明的变量具有不同的作用域,而外部循环内部声明的变量具有不同的作用域。

for(int i = 0; i < 10; i++){
    // In first iteration, value of i is 0

    for(int i = 1; i < 10; i++){
        // In first iteration, value of i is 1
    }
    // In first iteration, value of i is 0
}

更好的方法是对内部和外部循环使用不同的变量。

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

    for(int j = 1; j < 10; j++){

    }

}

答案 8 :(得分:6)

是的-更有趣的是,每次打开大括号时,您都可以重用变量名。这在插入诊断代码时通常很方便。键入一个大括号“ {”,然后声明和使用变量,然后关闭大括号,变量消失。这样可以保证您不会干扰主体中的任何内容,同时仍然保留了在括号外声明的任何变量,类和方法的优点。

答案 9 :(得分:3)

作用域规则:在for语句中声明的变量只能在该语句和循环主体中使用。

如果在代码中您在内部循环中定义了i的多个实例,则每个实例将占用其自己的内存空间。因此,不必担心结果会是相同的。

int main(void) {

    int i = 2; //defined with file global scope outside of a function and will remain 2
    if(1)
    {       //new scope, variables created here with same name are different
        int i = 5;//will remain == 5
        for(int i = 0; i < 10; i++)
        {   //new scope for "i"

            printf("i value in first loop: %d \n", i); // Will print 0 in first iteration
            for(int i = 8; i < 15; i++) 
            {   //new scope again for "i", variable with same name is not the same
                printf("i value in nested loop: %d \n", i); // Will print 8 in first iteration
            }
        }

    }

    return 0;
}

但是不建议使用相同的变量名,因为它很难理解,并且以后会变成不可维护的代码。

答案 10 :(得分:1)

重要的是内部循环参数包含int i。因为i是用这种方式重新定义的,所以两个变量不会互相影响;它们的范围是不同的。这里有两个例子来说明这一点:

for(int i = 0; i < 10; i++) // This code will print "Test" 100 times
{
 for(int i = 0; i < 10; i++)
 {
  puts("Test");
 }
}

请注意,上面的代码在内环参数中包含int i,下面的代码仅包含i

for(int i = 0; i < 10; i++) // This code will print "Test" 10 times
{
 for(i = 0; i < 10; i++)
 {
  puts("Test");
 }
}

答案 11 :(得分:0)

好吧,您可以在脚本没有问题的情况下执行此操作,但应避免使用这种结构。通常会导致混乱