c – 玩弄争论

受到 this的启发.

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

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

和:

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

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

(Here只是一个测试,看他们是相同的)

编辑:关键是让我作为索引向后访问向量(在索引优于迭代器的情况下)

编辑2:出于好奇:他们的汇编代码略有不同.见thisthis.

解决方法

人们可以想到一个for循环
for (<decl-init> ; <condition> ; <post-adjust>) <body>

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

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

上面的for和rewrite之间的最大区别是在< decl-init>中声明的变量的范围.阻止,但这对下面的分析并不重要.

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

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

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...