受this的启发。
假设我们有一个非空std::vector<T> v;
for (int i = v.size() - 1; i >= 0; i--) {
///Stuff.
}
和
for (int i = v.size(); i--; ) {
///Stuff.
}
我的意思是,出于可读性的考虑,我不会这样做,但是谁知道生活中有用的东西......
(Here只是一个测试,看它们是等价的)
编辑:要点i
作为索引来向后访问向量(在索引优于迭代器的情况下)
答案 0 :(得分:4)
可以想到for
循环
for (<decl-init> ; <condition> ; <post-adjust>) <body>
作为此while
循环的粗略等价物:
<decl-init>;
while (condition) {
<body>;
<post-adjust>;
}
上面for
和重写之间的最大区别是<decl-init>
块中声明的变量范围,但这对于下面的分析并不重要。
将这两个循环重写为while
循环可以得到:
int i = v.size() - 1;
while ( i >= 0 ) {
<body>;
i--;
}
VS
int i = v.size();
while (i--) {
<body>;
}
正如您所看到的,唯一的区别是i
在进入迭代之前递减,并且条件以i
大于1
而不是第一个循环开始。这两个调整“相互抵消”,从技术角度来看,你的循环是等价的。然而,美学是另一回事:副作用的条件比“纯粹”更难理解,所以第一个循环更具可读性。
答案 1 :(得分:2)
这是一种合法的方法,但在可读性方面使用i--
作为for循环的条件是一个糟糕的主意。
for循环意味着由3个部分组成 - 为什么让人们更难生活?
如果您坚持传统的for
循环,那么阅读您的代码的人会很高兴:
for (int i = v.size() - 1; i >= 0; i--) {
///Stuff.
}