while循环C / C ++中的变量声明

时间:2011-11-06 12:48:55

标签: c while-loop variable-declaration

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

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

输出99..99..99

但据我说,它应该运行无限次,因为每次控制进入循环时它获得值100.因此它永远不会达到零。 只是为了实验我在while循环中将int i=100;替换为i=100;,现在它运行无限次.WHY ???

5 个答案:

答案 0 :(得分:7)

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

基本上int i = 100 阴影上一个int i = 3以及while 区块内你指的是一个新变量

在一天结束时,我发现没有合理的情况你需要做这样的事情。

答案 1 :(得分:7)

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

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

循环内部{指的是您在} {内声明但在} i之外main()指的那个在{{1}}

中声明的那个

答案 2 :(得分: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);
}

答案 3 :(得分: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声明的int i = 3;在循环中它打印99因为i引用了iint i = 100;声明的--int i = 100;

如果您将i = 100更改为i,那么您正在更改第一个int a=4; { int a=10; } printf("%d", a); 而不会引入另一个变量。因此无限循环。

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

a

由于printf无法看到第二个printf("%d", a);,显然{{1}}无法引用它。我假设读者知道一个变量只能在其定义的范围内访问。否则,是的,前两个注释中的短语更精确。

答案 4 :(得分:1)

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

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