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。