【发布时间】:2020-03-01 23:13:30
【问题描述】:
在 C 或 C++ 中,在 for 循环中修改循环变量是导致严重错误的根源:
int main() {
std::vector<int> v (30);
std::iota(v.begin(), v.end(), 0);
int j = 0;
for (size_t i = 0; i < v.size(); i++) {
std::cout << v[i] << ' ' << i << '\n';
i++; // oops, I mean j++
}
std::cout << j << '\n';
}
有什么方法可以禁止或警告在编译器或其他东西的帮助下修改循环体内的循环变量?如果可以,我该怎么做?
【问题讨论】:
-
我会建议更好的命名。
i和j不是很具体,这就是为什么您最终在示例中修改i而不是j。 -
在其他一些语言中,这可以通过一种特殊类型的迭代器来完成,它返回元素及其索引的元组,但我认为在 C 中这样做是一种反模式。也许在 C++ 中可行。
-
@TedLyngmo:这个问题明确询问了 C 和 C++。示例代码是 C++ 并不能否定这一点。发帖者在真正只处理一个时,通常会同时标记 C 和 C++,但这个问题对两者都进行提问并非没有道理。
-
重新。返回元素及其索引的迭代器,请参阅:stackoverflow.com/questions/24881799/…(特定于 C++)