正在编译具有相同迭代器的嵌套循环,为什么会这样?
nested loop with the same iterator is being compiled, why is that?
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
,请使用::
操作符,它是变量前的范围解析操作符。
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 了解嵌套循环打印星号图案
- 无法掌握嵌套循环的写作技巧
- 在 c++ 中实现嵌套循环的更短方法吗?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 2 个嵌套循环的时间复杂度
- 嵌套循环背后的逻辑
- 使用 %s C++嵌套循环
- 嵌套循环和重复迭代器
- 如何在 c++ 下使用嵌套循环和正则表达式降低时间复杂度?
- C++在乘法图中放置随机值(嵌套循环)
- 如何使用 OpenMP 减少嵌套循环?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 学习嵌套循环C++与示例混淆
- 为什么 OpenCL 嵌套循环仅适用于某些元素
- 为什么Bubble Sort需要嵌套循环
- 为什么具有多个嵌套循环的代码可以在 GCC 上立即完成,但在 VS 上需要很长时间
- 正在编译具有相同迭代器的嵌套循环,为什么会这样?