3

根据我的说法,while循环应该是无限的,但它只运行三次

   main()
   {
   int i=3;       
   while(i--)
    {
      int i=100;
      i--;
      printf("%d..",i);
    }
   }

它输出99..99..99

但根据我的说法,它应该运行无限次,因为每次控制进入while循环时它的值都是100。所以它永远不会达到零。只是为了试验我在while循环中替换int i=100;i=100;现在它运行无限次..为什么???

4

5 回答 5

7

iin变量与循环内定义的变量while(i--)不同。i

基本上int i = 100 遮蔽了你所指的新变量的前面int i = 3和内部。while

归根结底,我发现没有合理的场景需要你做这样的事情。

于 2011-11-06T12:51:28.357 回答
7

检查条件的变量i是您在其中声明的变量,而main()不是循环内的变量。

两者都是不同的变量,您将它们混淆为一个,编译器不会像您一样容易混淆。

循环内部是i指您在内部声明的循环,{ }但在循环外部是{ }i在中声明的循环main()

于 2011-11-06T12:52:57.437 回答
5
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);
}
于 2011-11-06T12:56:21.370 回答
2

每个变量都引用其最近的声明(当然在该范围内有效):

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 次,因为它取决于在它打印的循环内部i声明的 that,因为 there引用了由ed声明的 that。int i = 3;99iiint i = 100;--

如果您更改int i = 100;i = 100,那么您将更改第i一个变量,而不是引入另一个变量。因此无限循环。

编辑有些人说,而不是“最近的”,我应该说“在当前范围内可访问的最里面的声明”给出这个例子:

int a=4;
{
    int a=10;
}
printf("%d", a);

由于第二个a不可见printf,显然printf("%d", a);无法引用它。我假设读者知道的足够多,知道一个变量只能在它定义的范围内访问。否则,是的,前两条评论中的短语更准确。

于 2011-11-06T12:53:15.643 回答
1

C++ 中的每个作用域(粗略地说,每对不用于特殊目的的大括号,例如数组初始化)都可能包含自己的局部变量声明。在循环内写入int i = 100;指定另一个名为的变量,该变量i与循环外的变量不同,并导致i默认情况下使用的范围内的代码引用内部i而不是外部。但是,i--循环中的条件仍然使用外部i

当你用 替换int i = 100i = 100,现在只有一个变量,它被设置为 100,递减两次(一次在循环内,一次由循环本身),然后重复地重新设置为 100。

于 2011-11-06T12:54:30.193 回答