【问题标题】:Confuse with variable scope for while and for loop(C programming)混淆 while 和 for 循环的变量范围(C 编程)
【发布时间】:2011-12-06 05:03:22
【问题描述】:

今天在写代码的时候,遇到了一些没想到会以这种方式发生的事情。下面是这个问题的示例代码。

密码 1

while(true)
{
 int i = 1;

 printf("This is %d\n" , i);
 ++i;
 if(i == 10)
   break;
}

密码 2

for(int i = 1 ; ; i++)
{
 printf("This is %d\n" , i);
 if(i == 10)
    break;
}

问题:

1.)第一个代码会导致无限循环,而后者不会。

2.)我不明白,while循环中有一个标准的提及变量声明可以被while循环中的任何语句访问,但是为什么if()不能访问变量i的值而后者可以吗?

感谢您花时间阅读我的问题

【问题讨论】:

  • 抱歉我刚才忘了缩进代码
  • 不,我尝试使用 C 语言和 PHP 都产生相同的结果

标签: c variables for-loop while-loop scope


【解决方案1】:

很简单:

for(int i = 1 ; ; i++)
{
    printf("This is %d\n" , i);
    if (i == 10)
        break;
}

等价于

{
    int i = 1;
    while (true)
    {
        printf("This is %d\n" , i);
        if (i == 10)
            break;
        i++;
    }
}

即,int i = 1 部分在for 循环的第一次迭代之前执行for 引入了一个隐式的额外范围块,其中包含在 for (X;Y;Z)X 中声明的任何变量。

【讨论】:

    【解决方案2】:

    问题在于,在您的 while 循环中,您不仅在声明 i,而且还在对其进行初始化。因此,在每次循环迭代中,i 都会重置为 1,从而导致您的无限循环。

    for循环在开始循环之前首先初始化i = 1,所以它更像是这样写一个while循环:

    int i = 1;
    while (true)
    {
        printf("This is %d\n" , i);
        if (i == 10) break;
        i++;
    }
    

    【讨论】:

      【解决方案3】:

      C 有块作用域的概念。在给定范围内声明的变量具有与该范围等效的生命周期。在while 循环案例中,这意味着循环的每次迭代都有一个i 变量。每次循环重新启动时,它都会创建一个新的i 并将其值设置为1i++ 仅在该实例上评估一次,因此它永远不会达到 10 并且确实会无限循环。

      只需将i 移动到while loop 之前即可修复第一个代码示例。

      int i = 1;
      while (true) {
        printf("This is %d\n" , i);
        ++i;
        if(i == 10)
          break;
      }
      

      现在i 在外部范围内声明,因此while 循环的所有迭代都将有一个i

      for 循环案例的工作原理几乎相同。在for 循环中声明的迭代变量为循环的所有迭代定义一次。

      【讨论】:

      • 是的,C 有块作用域,但是从 C99 开始,for 引入了一个隐式的额外块。
      • 感谢您的澄清,我开始理解这背后的逻辑:),非常感谢您提供的所有宝贵答案
      猜你喜欢
      • 2011-05-27
      • 2016-10-22
      • 2023-03-31
      • 2023-02-02
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多