Это не имеет никакого значения для значения столбца
внутри цикла - если столбец
является примитивным значением. Если бы 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. , но это будет заметно только в том случае, если вы зацикливаетесь в течение очень долгого времени (и, конечно, «Больше вычислительных грехов совершается во имя эффективности, чем по какой-либо другой единственной причине» .)
Что касается вопроса 2:
Вопрос 2: Будет ли использоваться >> = 1U вместо = / 2 имеет значение?
Маловероятно.Битовый сдвиг был бы быстрее, если бы компилятор не оптимизировал, но есть вероятность, что ваш компилятор оптимизирует это до битового сдвига.
В качестве примечания, я обычно считаю, что выполняю unsigned variableName
(то есть отбрасываю int
) плохой практикой - хотя C ++ вставляет int
везде, где он отсутствует, он менее читабелен для меня.
1. : Стивен в комментариях ( другой Стивен;)) отмечает, что - «Предварительное приращение более эффективно для стандартных итераторов контейнеров, но не отличается для примитивных типов, поскольку копирование целого числа является дешевле, чем копирование итератора большего размера (в частности, итераторы std :: set и std :: map) ".
Нет никакой разницы для беззнакового
. Однако будет разница для классов с перегруженным оператором ++
, потому что он будет вызывать свои разные перегрузки (обычно постфиксный оператор создает копию класса, что означает, что он может работать медленнее).
Будет ли разница в использовании >> = 1U вместо / = 2?
Скорее всего, нет. Его семантика одинакова для unsigned, и компиляторы обычно обрабатывают их одинаково и могут менять один на другой, если он быстрее.