while循环C / C ++中的变量声明
据我说,while循环应该是无限的,但它只运行三次
main() { int i=3; while(i--) { int i=100; i--; printf("%d..",i); } }
它输出99..99..99
但据我说,它应该运行无限次,因为每次控制进入循环它得到值100.所以它永远不会达到零。 只是为了实验我替换了int i=100;
i=100;
在while循环中,现在它运行无限次.WHY ???
检查条件的变量i
是你在main()
声明的变量而不是循环中的变量。
两者都是你将它们混淆为一体的不同变量,编译器不会像你一样容易混淆。
在循环内部, i
引用你在{
}
内部声明的那个,但在{
}
之外, i
指的是在main()
声明的那个
while(i--)
中的变量i
与循环内定义的变量i
不同。
基本上int i = 100
影响前一个int i = 3
并且在你引用一个新变量的那一段内 。
在一天结束时,我发现没有合理的情况你需要做这样的事情。
while(i--) { int i=100; // gets created every time the loop is entered i--; printf("%d..",i); } // the i in the loop keeps getting destroyed here
你为什么不尝试:
while(i--) { { int i=100; //Visible only in this scope i--; printf("inner i=%d..",i); } //gets destroyed here printf("\nouter i=%d..\n",i); }
每个变量都引用其最新的声明(当然在该范围内有效):
main() { int i=3; while(i--) // this i is the one defined in the line above { int i=100; i--; // this i is the one defined in the line above printf("%d..",i); // this i is the one defined two lines above } }
所以你的while循环迭代3次,因为它依赖于由int i = 3;
声明的int i = 3;
在循环内部它打印99
因为i
指的是由int i = 100;
声明的int i = 100;
是--
编辑。
如果你改变int i = 100;
到i = 100
,那么你正在改变第一个i
而不是引入另一个变量。 因此无限循环。
编辑有些人说,而不是“最近的”我应该说“在当前范围内可访问的最内层声明”给出了这个例子:
int a=4; { int a=10; } printf("%d", a);
由于printf
不能看到第二个a
,显然是printf("%d", a);
不能参考它。 我假设读者知道一个变量只能在其定义的范围内访问。否则,是的,前两个注释中的短语更精确。
C ++中的每个范围(粗略地说,每对未用于特殊目的的大括号,如数组初始化)可能包含自己的局部变量声明。 写int i = 100;
在循环内指定另一个名为i
变量,它与循环外的变量不同,并导致范围内使用i
代码默认情况下引用内部i
而不是外部i
。 但是,循环条件下的i--
仍然使用外部i
。
当你用int i = 100
替换int i = 100
时,现在只有一个变量,它被设置为100,减少两次(一次在循环内,一次由循环本身),并重复设置为100。