В цикле 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 в цикле (к/а)?