请解释for循环索引的范围

时间:2013-11-15 06:20:42

标签: c++

我只想确认一下我对循环索引的怀疑。我正在使用c ++。 我的代码中有两个for循环。对于一个我声明我的索引在循环之外,即

int i;
for(i = 0; i < n; i++){ 
. . .
}
cout << i <<endl;

然后我有了:

for(int j = 0; j<n; j++){
. . .
}
cout << j <<endl;

在第一种情况下,我看到输出了一些随机数。在第二种情况下,我得到一个关于-fpermissive或类似的错误消息。我只是想在循环结束时确认索引超出范围,因为这似乎正在发生的事情。 我试图稍后使用索引,我想我只需要在循环中放入第二个索引来增加i或j,然后我可以稍后使用该值。即:

 int index = 0;
 for(int j = 0; j<n; j++){
 . . .
 index ++;
 }
cout << index <<endl;

有人会为我确认这个吗?

3 个答案:

答案 0 :(得分:1)

在第一种情况下,由于j在循环外声明,因此i的范围甚至是循环的外部。所以,

cout<<i<<endl;

打印n的值。第二种情况,j在循环中声明。所以j的范围只在循环内部;所以你得到了错误。

所以第一个案例本身你可以在后期阶段使用i的值

#include<stdio.h>
main()
{
    int i;
    for(i=0;i<5;i++)
    printf("%d\n",i);
    return 0;
}

给了我一个5的输出。

答案 1 :(得分:1)

第一个例子:: http://codepad.org/L5VErMAh

int main( void )
{
  int i, n = 10 ;
  for(i = 0; i < n; i++){ 
    // do something useful. . .
  }
  cout << i <<endl;

  return 0 ;
}

输出:: 10 说明:: i循环的nglobal范围为for。因此,在执行for循环后,它们不会变为无效或未定义。

第二个例子:: http://codepad.org/iqNtQ1Ok

int main( void )
{
    int n = 10 ;
    for(int j = 0; j < n; j++){ 
        // do something useful. . .
    }
    cout << j <<endl;

    return 0 ;
}

输出:: name lookup of 'j' changed for new ISO 'for' scoping

解释:: n的范围globalfor循环但jfor循环内声明,其范围和生命周期local循环为for。这意味着,j将在执行for循环后被销毁。这就是错误的原因。

第三个例子::我想,你必须知道它与第一个例子完全相同。

现在你怀疑,“In the first case I see that some random number is outputted.”不,除非你在for循环中做错了什么,否则这种情况不会发生。您可以发布第一个案例for循环代码,我们可以指出错误。

答案 2 :(得分:0)

这个人只会打印n

int i;
for(i = 0; i < n; i++){
//...
}
cout << i <<endl;//prints the value of n

这个J被宣布超出范围

for(int j = 0; j<n; j++){
. . .
}
cout << j <<endl; //the compiler asks: whats a j?

,最后一个与第一个

相同
 int index = 0;
 for(int j = 0; j<n; j++){
 . . .
 index ++;
 }
 cout << index <<endl;//still prints n