постфиксный и префиксный оператор приращения в цикле for [duplicate]

17
задан Community 23 May 2017 в 11:45
поделиться

2 ответа

Это не имеет никакого значения для значения столбца внутри цикла - если столбец является примитивным значением. Если бы 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) ".

21
ответ дан 30 November 2019 в 13:27
поделиться

Нет никакой разницы для беззнакового . Однако будет разница для классов с перегруженным оператором ++ , потому что он будет вызывать свои разные перегрузки (обычно постфиксный оператор создает копию класса, что означает, что он может работать медленнее).

Будет ли разница в использовании >> = 1U вместо / = 2?

Скорее всего, нет. Его семантика одинакова для unsigned, и компиляторы обычно обрабатывают их одинаково и могут менять один на другой, если он быстрее.

2
ответ дан 30 November 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: