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