任何人都可以解释这些之间的区别:
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
会有什么不同吗?
答案 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来说是相同的,编译器通常会对它们进行相同的处理,如果速度更快,可以将它们改为另一个。