使用 alternative 变量声明更改 for 循环的范围:
Scope of for loop changing with alternative variable declarations:
我试图通过测试以下三个示例来理解 for 循环的范围:
示例 1:
int a=15;
for(a=1;a<3;a++) {
cout<<a<<endl;
}
cout<<a<<endl;
此处控制台显示 1 2 3。 但是,我认为它应该显示 1 2 15,因为通常似乎 for 循环内变量 a 的作用域仍保留在 for 循环内。
示例 2:
for (int a=1; a<3; a++) {
cout<<a<<endl;
}
cout<<a<<endl;
在此示例中,编译器无法识别 for 循环后的变量 a - 正如预期的那样。 那么,如何在示例 1 中识别它呢?
例3:
int a=15;
for(int a=1;a<3;a++) {
cout<<a<<endl;
}
cout<<a<<endl;
在这种情况下,控制台显示 1 2 15。 这与示例 1 有什么区别?
提前感谢您的帮助。
分析示例 1:
int a=15;
此行声明一个变量a
。可以读取或写入此变量。它一直有效到声明它的块的末尾。在这里,没有可见的此类块;在实际程序中,块是介于{
和}
之间的代码。
for(a=1;a<3;a++) {
cout<<a<<endl;
}
在这些行中,从第一行修改变量。它仍然是同一个变量,只是变量的值发生了变化。想象一个像一张纸这样的变量。纸张始终保持不变,只是您在上面写下不同的数字(用铅笔)并擦除它们(用橡胶胶)。
cout<<a<<endl;
由于没有相应的}
,变量a
在这里仍然可见。
示例
3 与示例 1 的一个词不同:for
循环中的int
。此int
是一个新的变量声明。现在您有两个名为 a
的变量。使用纸的类比,你只是抓住另一张纸,把它放在你的第一张纸上面。因此,第一张纸变得不可见。
在for
循环的末尾,在关闭}
,您拿起上一张纸(此时上面写着数字 3)并将其扔进垃圾箱。这使得外表再次出现,上面仍然写着值 15。
在示例 1 中,您在 for
循环的范围之外声明a
,然后不重新声明它(即 int a
)。因此,循环内外的变量a
是相同的。在第一次迭代中,它是 1,然后递增到 2。它仍然满足for
循环条件,因此它再次执行,然后递增到 3。现在,a
不符合for
循环条件,因此它使循环的值为 3。最后,再次打印,其值为 3。
示例 2 中无法识别 a
的原因是从未在循环外部声明a
。它是 for
循环的局部变量,因此不存在于该循环之外的任何范围内。
在示例 3 中,您第二次声明a
,在 for
循环声明中,您说int a = 1
而不仅仅是a = 1
。这意味着有一个 for
循环的本地a
,以及此循环之外的a
,它从循环执行之前保持其值,因为它们是两个不同的变量 - 它们具有相同的名称但不同的作用域。
例 1 的解决方案:在第一个示例中,您在第一行声明了 var 'a',即在执行 for 循环之前,最初值为 15,但在 for 循环中,您将其初始化为 1,for 循环迭代两次,从而产生 1 和 2.In 第三次迭代"a"递增,因此现在 a=3,但条件失败,因为"a"不小于 3.So 最后打印 3。
例 2 的解决方案:由于变量是在 for 循环中声明的,因此它的作用域位于 for 循环本身内,因此变量在 for 循环之外无法访问。因此错误
例 3 的解决方案:Ex1 和 Ex3 之间的区别在于示例 3 中,我们有两个 'a' 的副本,一个在 for 循环之外,其值为 15,另一个在 for 循环内,其范围在 for 循环内。因此,内部 for 循环 var 'a' 结果为 1 2 作为输出,外部 var a 最终结果为 15。
- 在基于范围的for循环中使用结构化绑定声明
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 为什么基于循环范围不直接在C 中使用参数阵列
- 为什么这个循环变量在循环范围之外是可访问的
- 在基于范围的循环范围内的双/整数使用和数据缩小
- 是cbegin/Cend不足以使循环范围
- 变量循环范围会导致返回局部变量的地址引用
- 地图元素上的循环范围
- 使用基于自动的范围用于循环VS,使用对循环范围的基于对的范围
- 访问 C++ 中 if 循环范围之外的矢量
- 循环范围内的初始值设定项列表
- 用于循环范围范围
- 为什么需要两个循环范围来更改C++向量的这些元素
- 在下一个循环之前访问基于 for 循环范围的下一个元素
- 在循环范围之外声明参数是否更有效?
- 循环范围拆分中的变量预评估
- 为什么我的循环范围不会改变元素?
- 我的循环范围不起作用
- 循环范围在使用索引元素时不起作用
- 对基于循环范围的误解