for循环中的后缀和前缀增量运算符

时间:2010-08-22 12:04:02

标签: c++ loops

  

可能重复:
  Difference between i++ and ++i in a loop?

任何人都可以解释这些之间的区别:

for(unsigned col = 0; col < n; ++col, num_to_fill >>= 1U)
{

    for(unsigned row = num_to_fill; row < (1U << n); row += (num_to_fill * 2))
    {
        std::fill_n(&output[col][row], num_to_fill, 1);
    }
}

for(unsigned col = 0; col < n; col++, num_to_fill >>= 1U)
{

    for(unsigned row = num_to_fill; row < (1U << n); row += (num_to_fill * 2))
    {
        std::fill_n(&output[col][row], num_to_fill, 1);
    }
}

col=0时,ex.1 Output[col][row]将为output[1][row],而ex.2 Output[col][row]将为output[0][row]。我是对的吗?

问题2:使用>>= 1U代替/= 2会有什么不同吗?

2 个答案:

答案 0 :(得分:21)

它对循环中col的值没有任何影响 - 假设col是原始值。如果col是一个类,前缀和后缀“++”运算符可能会重载以执行两个不同的操作,尽管我认为这是不好的做法。请考虑以下示例:

#include <iostream>

using namespace std;

int main() {
    for(int i = 0; i < 10; i++) {
        cout << i << endl;
    }

    cout << endl;

    for(int i = 0; i < 10; ++i) {
        cout << i << endl;
    }

}

这两个都打印出0到9,尽管你在一个中预先增加,在另一个中增加后增量。无论是否使用前置或后置增量,i的增量都会在循环的每次运行结束时发生。我相信预递增更有效,因为 - 我可能在这里错了 - 编译器不需要使用临时变量 1。,但这只有在你循环时才会引起注意很长一段时间(当然还有'More computing sins are committed in the name of efficiency than for any other single reason'。)

关于问题2:

  

问题2:使用&gt;&gt; = 1U   而不是= / 2有什么不同?

不太可能。如果编译器没有优化,则位移会更快,但很可能你的编译器会将其优化为位移。

作为旁注,我通常会发现正在做unsigned variableName(即放弃int)不良做法 - 尽管C ++会在int内的任何地方推迟,但它是对我不太可读。

1。:Stephen在评论中(不同的 Stephen;))注意到 - “预增量对于标准库容器迭代器更有效,但它不是原始类型不同,因为复制一个整数比复制一个更大的迭代器(特别是std :: set和std :: map iterators)便宜。“

答案 1 :(得分:2)

unsigned没有区别。但是,重载operator++的类会有所不同,因为它会调用其不同的重载(通常,后缀运算符会创建类的副本,这意味着它可能会更慢)。

  

使用&gt;&gt; = 1U代替/ = 2会有什么不同吗?

可能不是。它的语义对于unsigned来说是相同的,编译器通常会对它们进行相同的处理,如果速度更快,可以将它们改为另一个。