玩弄争论

时间:2013-08-19 01:10:40

标签: c++

this的启发。

假设我们有一个非空std::vector<T> v;

之间有什么区别吗?
for (int i = v.size() - 1; i >= 0; i--) {
///Stuff.
}

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

我的意思是,出于可读性的考虑,我不会这样做,但是谁知道生活中有用的东西......

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

编辑:要点i作为索引来向后访问向量(在索引优于迭代器的情况下)

编辑2:出于好奇:他们最终拥有轻微不同的汇编代码。请参阅thisthis

2 个答案:

答案 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.
}