2011-10-12 66 views
4

今天在我编写代码时,我遇到了一些我并不期望以这种方式发生的事情。下面只是示例代码。混淆while和for循环的变量作用域(C编程)

的代码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的值,而后者可以访问??

谢谢你花时间阅读我的问题

+0

对不起,我忘了刚才 – caramel1995

+0

都能跟得上它缩进的代码,我已经尝试使用C语言和PHP都产生相同的结果 – caramel1995

回答

11

这很简单:

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 -loop的第一次迭代。 for引入了一个隐含的额外范围块,其中包含for (X;Y;Z)X中声明的任何变量。

+0

谢谢:)赞赏 – caramel1995

6

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

第一个代码示例可以通过在while loop之前简单地移动i来修复。

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

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

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

+1

是的,C有块范围,但是由于C99引入了'for'的隐式额外块。 –

+0

谢谢澄清,我开始理解这背后的逻辑:),非常感谢你给出的所有宝贵答案 – caramel1995

1

问题是,在你的while循环中,你不仅声明了我,你还在初始化它。所以在每次循环迭代中,我都重置为1,导致无限循环。

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

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

谢谢澄清:) – caramel1995