'for'循环内的'for'循环可以使用相同的计数器变量名吗?

Ucl*_*dde 104 c loops for-loop nested

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

或者变量会相互影响吗?以下代码是否应该为第二个循环使用不同的变量,例如j,或者是否i正常?

for(int i = 0; i < 10; i++)
{
  for(int i = 0; i < 10; i++)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 136

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

这通常是不好的风格,容易混淆,应该避免.

只有在内部单独定义的情况下,对象才会有所不同,就像int i您所示.如果在未定义新对象的情况下使用相同的名称,则循环将使用相同的对象并相互干扰.

  • 使用for(i)和for(j)嵌套,在i ++中,将增加外循环变量.但是,如果在两个循环中使用相同的标识符,那么您所说的是正确的,因为它们是不同范围的变量. (3认同)
  • @BloodGain:"对象"是C标准中使用的技术术语.我故意在这里使用它. (3认同)

das*_*ght 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);
}
Run Code Online (Sandbox Code Playgroud)

现在两个循环都使用相同的变量.但是,如果不编译它,它需要一段时间来弄清楚这段代码的作用(演示);

  • 由于这个问题的措辞是"使用相同的计数器变量",我还想指出阴影仅在重新定义发生时发生.在内部for循环中省略`int`,即实际使用相同的计数器变量,将导致外循环仅运行一次,因为内循环将离开`i == 10`.这是微不足道的,但认为它提供了如何说明问题的澄清 (4认同)
  • @dasblinkenlight:实际上,我对方向有一个大脑痉挛,而内部名称确实影响了外部名称.我之前的评论在这方面是错误的.我很抱歉.(但是,这是英语意义上的,不是官方意义上的 - 维基百科不是C或一般编程的官方出版物,我不知道任何定义该术语的办公室或权威机构.)C标准使用"隐藏",所以这是可取的. (2认同)

OmG*_*OmG 25

您可以.但是你应该知道is 的范围.如果我们称之为外ii_1和内ii_2,所述的范围iS是如下:

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
}
Run Code Online (Sandbox Code Playgroud)

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


小智 16

这是完全可能的,但请记住,你不能解决 第一个声明我

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

如果你的创意足够,你可以在一个循环中完成它们

for(int i ,j= 0; i < 10; (j>9) ? (i++,j=0) : 0 ,j++)
{
    printf("%d %d\n",i,j);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我在代码审查期间在嵌套循环中捕获了阴影i变量,我会将其视为一个辅导机会.如果我抓住了一个像你上一个例子那样模糊内循环的人(那不是一个循环),我可能会把它们扔出窗外. (5认同)
  • 这就是为什么我说你_obfuscated_循环.你还在循环,你只是用不太明显的语法隐藏它.而且它在各个方面都更糟糕. (2认同)

H.S*_*.S. 12

是的,您可以为内for循环使用与外for循环相同的计数器变量名称.

来自for循环:

for ( init_clause ; cond_expression ; iteration_expression ) loop_statement
作为表达语句loop_statement建立它自己的块范围,从范围不同init_clause.

for (int i = 0; ; ) {
    long i = 1;   // valid C, invalid C++
    // ...
}  
Run Code Online (Sandbox Code Playgroud)

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

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

迭代语句是一个块,其范围是其封闭块范围的严格子集.循环体也是一个块,其范围是迭代语句范围的严格子集.

来自C标准#6.2.1p4标识符的范围[强调我的]

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


Cha*_*onX 9

从代码/编译器的角度来看,这将是一个非常有效和合法的事情.的int i在内部声明for(int i = 0; i < 10; i++)循环是在一个新的和更小的范围,以便声明阴影的声明int i在外环(或者,与其他词:在内部范围内的所有接入到可变i转到int i在内侧范围内声明,离开int i外部范围不受影响).

也就是说,从代码质量的角度来看,这是非常可怕的.它难以阅读,难以理解且易于误解.不要这样做.


Zay*_*hin 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
}
Run Code Online (Sandbox Code Playgroud)

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


小智 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
Run Code Online (Sandbox Code Playgroud)

类似于循环的情况,在内部循环内声明的变量具有不同的范围,并且声明外部循环的变量具有不同的范围.

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
}
Run Code Online (Sandbox Code Playgroud)

更好的方法是为内循环和外循环使用不同的变量.

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

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

    }

}
Run Code Online (Sandbox Code Playgroud)


小智 6

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