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 {
...
}
}
}
}
我提到的两行未被识别为编译错误,为什么会这样? 感谢
答案 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语句中。