2010-08-22 98 views
14

可能重复:
Difference between i++ and ++i in a loop?后缀和前缀增量运算在for循环中

谁能解释什么是那些之间的区别:

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,在例1中Output[col][row]将是output[1][row]和在例2中Output[col][row]将是output[0][row]。我对吗 ?

问题2:使用而不是/= 2会有什么区别吗?

+1

如果我没有记错,在这种情况下,它没有任何区别。当使用变量作为“R-Value”时,它确实有所作为:'a = b ++;'或'a = ++ b;' – 2010-08-22 12:07:00

+0

对于这个问题,答案大多不正确,Greg。他们回答什么是post和pre incrementation,不是**他们是如何在一个循环中工作的 - 事实上许多人都误导他们,他们运用它确实有所作为,因为他们的循环使用了误导语法('int i = 0; foreach(randomOtherThing in randomOtherThings)'......) – Stephen 2010-08-22 12:14:26

+0

好的。第二个问题呢? – Ahmed 2010-08-22 12:14:48

回答

19

它不会对循环内的值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:请问使用>> = 1U 代替=/2有什么区别?

不太可能。如果编译器没有进行优化,位移会更快,但是您的编译器很可能会优化这种转换。

作为一个方面说明,我通常发现做unsigned variableName(即丢弃int)不好的做法 - 尽管C++会在任何地方int一个推缺失,这是我的可读性。

1.:斯蒂芬评价(一个不同斯蒂芬;))指出, - “预增量为标准库容器迭代器更有效,但它的基本类型没有什么不同,因为复制的整数比复制更大的迭代器(特别是std :: set和std :: map迭代器)要便宜。“

+0

是全面的。 – Ahmed 2010-08-22 12:18:14

+1

对于标准库容器迭代器,预增量效率更高,但对于基元类型来说,它并没有什么不同,因为复制整数比复制更大的迭代器(特别是std :: set和std :: map迭代器)便宜。 p.s.我不是产生这个答案的'斯蒂芬' – 2010-08-22 12:20:16

+0

@Stephen谢谢,其他斯蒂芬。我将包括你的答案。然后,信用'斯蒂芬',当然:第。 – Stephen 2010-08-22 12:23:23

1

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

将使用>> = 1U而不是/ = 2有什么区别吗?

可能不是。它的语义对于未签名的语义是一样的,编译器通常会平等地对待它们,如果速度更快,它们可以将其更改为另一个。

+0

我不知道为什么代码编写器使用它。 – Ahmed 2010-08-22 12:17:57

+0

它可以更好地描述整体操作。例如,如果被分割(或移位)的变量是某种位向量,其中算术分割是无意义的概念,但移位是有意义的。 – 2010-08-22 12:25:51