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

Когда я компилирую и запускаю код ниже с 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 на консоль, если counter++ используется (потому что 1 добавляется к счетчику в конце цикла). в то время как std::cout << counter << endl; должен выводить 2 на консоль, если ++counter используется (потому что 1 добавляется к счетчику в начале цикла).

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

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

6

Решение

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

Что касается того, когда проводится оценка:

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

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

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

Другие решения

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

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

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

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

5

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

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

В цикле

for(initialization;condition;increment/decrement)

{body;}

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

В чем разница между прединкрементным и постинкрементным циклом (для / во время)?

1
По вопросам рекламы [email protected]