В цикле for существует ли разница между pre / post-incrementing переменной управления циклом с точки зрения общего количества итераций?

когда я компилирую и запускаю код ниже с помощьюcounter++ или ++counter заменить на x, выход идентичен; в обоих случаях числа 1-10:

for (int counter = 1; counter < 11; x)
{
    std::cout << counter << endl;
}

Первоначально я думал ++counter увеличится на 1, а затем вернет новое значение, прежде чем будет вычислено логическое выражение в заголовке цикла. я.е, когда, начиная с counter = 1 и с помощью ++counter, counter будет иметь значение 2 в логическом выражении. Это выглядит не так, как выходы идентичны, а не ++counter версия с одной итерацией меньше, как я и ожидал.

чтение вокруг, кажется ++counter и counter++ инкремент counter на 1 в начале или конце тела цикла соответственно. В таком случае не является ли это, по крайней мере концептуально, идентичным действием? Потому что конец и начало цикла-это одно и то же, как только цикл прошел первую итерацию.

единственный раз, когда я вижу, что это делает разницу на первой итерации, где std::cout << counter << endl;должен выводить 1 на консоль, если (поскольку 1 добавляется в счетчик в конце цикла). В то время как std::cout << counter << endl; должен выводить 2 на консоль, если (поскольку 1 добавляется в счетчик в начале цикла).

в дополнение к вопросу выше, не могли бы вы точно объяснить порядок, в котором три действия оцениваются в заголовке цикла for, и объяснить, где именно происходят итерации при использовании i++ и ++i.

большое спасибо!

3 ответов


нет никакой разницы. В старых компиляторах ++counter было быстрее, потому что он не создал временную переменную, но все современные компиляторы могут оптимизировать это. Для тяжелых объектов с настраиваемыми (не встроенными) операторами приращения,++counter все еще может быть более эффективным.

когда оценка происходит:

for (initialization; condition; increment/decrement)
    code;

оценивается как

{
    initialization;
    while (condition)
    {
        code;
        increment/decrement;
    }
}

C++ for-loop может быть примерно рассматривается как синтаксический сахар для следующего (используя Ваш пример):

int counter = 1;
while (counter < 11)
{
    std::cout << counter << endl;
    x;
}

Итак, оператор инициализации выполняется первым, выражение условия выполняется перед каждой итерацией, а оператор increment выполняется в конце каждой итерации.

мы можем видеть здесь, что использование операторов post-increment или pre-increment не имеет никакого значения для логики цикла, хотя могут быть и другие различия (post-increment фактически требует сохранения копии старого значения переменной, поскольку это значение выражения, которое имеет некоторые связанные затраты, см. Preincrement быстрее, чем постинкремент в C++ - правда? Если да, то почему?).


counter++ делает счетчик увеличения копии и возвращает значение

++счетчик увеличивает счетчик и возвращает счетчик.

в цикле

for(initialization;condition;increment/decrement)

{body;}

increment / decrement-последняя строка цикла. Таким образом, он снова запустит цикл, когда increment/decrement вернет значение. Таким образом, пост-приращение или пред-приращение не повлияет здесь. Смотрите это

в чем разница между pre-increment и post-increment в цикле (к/а)?