7

受此启发

假设我们有一个非空std::vector<T> v; 之间有什么区别

for (int i = v.size() - 1; i >= 0; i--) {
///Stuff.
}

和:

for (int i = v.size(); i--; ) {
///Stuff.
}

?

我的意思是,为了可读性,我不会这样做,但谁知道什么对生活有用......

这里只是一个测试,看看它们是等价的)

编辑:重点是具有i作为索引来向后访问向量(在具有索引比具有迭代器更可取的情况下)

编辑2:出于好奇:它们最终的汇编代码略有不同。看到这个这个

4

2 回答 2

4

可以想到一个for循环

for (<decl-init> ; <condition> ; <post-adjust>) <body>

作为这个while循环的粗略等价物:

<decl-init>;
while (condition) {
    <body>;
    <post-adjust>;
}

和上面的rewrite最大的区别在于blockfor中声明的变量的作用域<decl-init>,但这对于下面的分析并不重要。

将两个循环重写为while循环可以为您提供:

int i = v.size() - 1;
while ( i >= 0 ) {
    <body>;
    i--;
}

对比

int i = v.size(); 
while (i--) {
    <body>;
}

如您所见,唯一的区别是i在进入迭代之前递减,并且在第一个循环中条件以i大于等于开始。1这两个调整“相互抵消”,使您的循环从技术角度来看是等效的。但是,美学是另一回事:具有副作用的条件比“纯”条件更难理解,因此第一个循环更具可读性。

于 2013-08-19T01:28:31.250 回答
2

这是一种合法的做法,但i--在 for 循环中用作条件在可读性方面是一个糟糕的想法。

for 循环由 3 个部分组成 - 为什么要让人们过得更艰难?

如果您坚持传统for循环,阅读您的代码的人会很高兴:

for (int i = v.size() - 1; i >= 0; i--) {
    ///Stuff.
}
于 2013-08-19T01:26:27.170 回答