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

nested loop with the same iterator is being compiled, why is that?

本文关键字:为什么 嵌套循环 迭代器 编译      更新时间:2023-10-16
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 {
    ...
    }
  }
}

}

我提到的两行没有被识别为编译错误,为什么会这样?由于

在内部循环中声明的i在其作用域的持续时间内隐藏在外部循环中声明的i。我很好奇(从来不知道这是允许的!),所以我找到了标准的相关部分:

( 3.3.1 )声明的作用域与其潜在作用域相同,除非潜在作用域包含另一个同名声明。在在这种情况下,内部声明的潜在作用域的作用域中不包含声明性区域外部(包含)声明区域中的声明。

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

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

内部的i只是隐藏了外部变量i。这不是错误,只是不鼓励。

无法在第三个for循环中访问外部的"int i"

一方面根据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

另一方面

for语句for (for-init-statement conditionopt;Expressionopt)语句等价于
{
for-init-statement
while ( condition ) {
statement
expression ;
}
}

如前所述,for-init语句和条件没有在前面for语句的最外层声明,以便将一个for语句嵌套在另一个for语句中。

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

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