【发布时间】:2018-09-03 16:49:29
【问题描述】:
我一直在搞乱基于范围的 for 循环,比如这个:
int a[] = {1, 2, 3, 4};
for(auto i : a){
cout << i;
}
(如果我错了,请在这里纠正我)我想i 在每次迭代开始时都分配了序列容器a 中的下一个值,例如:
i = a[0] … 迭代 1
i = a[1] … 迭代 2
…
i = a[9] … 迭代 10
我想问一下当循环控制变量是参考时这是如何工作的:
for(int &i : a){...}
由于在初始化时未分配引用而是绑定了引用,并且绑定永远不会改变,那么i 如何在给定的迭代中通过a 保存a 的元素的值,但是当分配了引用时,除了在声明中就像分配原始变量一样。要更改我们必须使用引用的数组元素,我的问题是如何将单个引用绑定到不同的变量(即循环期间a 的元素),因为每个元素都可以在循环内使用相同的引用变量进行修改。
谢谢
【问题讨论】:
-
i是循环内的局部变量。本质上,每次循环都会声明和初始化一个新实例。另请参阅this article - 它显示了编译器如何将 range-for 循环重写为“正常”循环。 -
@IgorTandetnik 我可能错了,但我认为基于范围的 for 循环可能类似于通常的 for 循环,它维护一个可以递增或递减的控制变量。还有你说的那个链接,例子看不懂,能不能简单解释一下,能回答就更好了。
-
你的循环被编译器重写为
for (auto iter = std::begin(a); iter != std::end(a); ++iter) { int& i = *iter; ...}在这种情况下,iter只是int*指针。