我可以在for
循环内的for
循环中使用相同的计数器变量吗?
还是变量会互相影响?以下代码是否应该在第二个循环中使用其他变量,例如j
,还是i
很好?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}
答案 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)
好吧,您可以在脚本没有问题的情况下执行此操作,但应避免使用这种结构。通常会导致混乱