正在编译具有相同迭代器的嵌套循环,为什么呢?

时间:2014-07-10 12:42:44

标签: c++ loops compilation nested

for (int k = 0; k <= CONST; k++) {
for (int i = 0; i < CONST; i++) {                   <=== THIS ROW
  if (...){
    for (unsigned int i = 0; i < CONST; i++) {      <=== AND THIS ONE 
      if (...) {
       ...
      }
    }
    if (...) {
     ...
    }
    else {
    ...
    }
  }
}

}

我提到的两行未被识别为编译错误,为什么会这样? 感谢

5 个答案:

答案 0 :(得分:2)

内部循环中声明的i会隐藏在外部循环中声明的i的范围。我很好奇(从来不知道这是允许的!),所以我挖出了标准的相关部分:

  

(的 3.3.1 )   声明的范围与其潜在范围相同,除非   潜在范围包含另一个同名声明。在   那种情况下,内部宣言的潜在范围   (包含)声明性区域被排除在范围之外   外部(包含)声明性区域中的声明。

虽然这是标准允许的(因此所有符合标准的编译器),但这是不好的做法,因为作为程序员,你必须跟踪你在不同点上引用的名为i的变量。代码!此外,您无法访问内循环中的外循环i

答案 1 :(得分:1)

在内循环中声明的i在第二个i循环中隐藏了for的声明。

答案 2 :(得分:1)

内心我只是隐藏外部变量i。这不是一个错误,只是气馁。

您无法在第三个for循环中访问外部“int i”。

答案 3 :(得分:0)

这是因为这两个不同的变量的范围。在一个内部的范围仅限于最里面的for循环,而外部的一个具有范围直到它的for循环。但是在i之外创建本地(内部)i时不会干扰因为在内部,每当调用i时,它主要调用本地的本地,而不是外部/全局一。它以某种方式遵循层次结构,因为您重新定义了变量。

因此,要调用全局i,请使用此运算符::,它是变量之前的范围解析运算符。

答案 4 :(得分:0)

一方面根据C ++标准

If the name is re-declared in the outermost block of a substatement controlled by the
condition, the declaration that re-declares the name is ill-formed

另一方面

  

1 for(for-init-statement conditionopt; for)语句   expressionopt)语句相当于

{
for-init-statement
while ( condition ) {
statement
expression ;
}
}

因为它看到for-init-statement和条件没有在前面的for语句的最外面的块中声明,如果要将一个for语句嵌套在另一个for语句中。