Когда я компилирую и запускаю код ниже с 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
,
Большое спасибо!
Нет никакой разницы. В старых компиляторах ++counter
был быстрее, потому что он не создавал временную переменную, но все современные компиляторы могут оптимизировать это. Для тяжелых объектов с пользовательскими (не встроенными) операторами приращения, ++counter
все еще может быть более эффективным.
Что касается того, когда проводится оценка:
for (initialization; condition; increment/decrement)
code;
оценивается как
{
initialization;
while (condition)
{
code;
increment/decrement;
}
}
Цикл for C ++ может быть грубо рассматривается как синтаксический сахар для следующего (на вашем примере):
int counter = 1;
while (counter < 11)
{
std::cout << counter << endl;
x;
}
Таким образом, оператор инициализации выполняется первым, выражение условия выполняется перед каждой итерацией, а оператор приращения выполняется в конце каждой итерации.
Здесь мы можем видеть, что использование операторов постинкремента или преинкремента не имеет никакого значения для логики цикла, хотя могут быть и другие различия (постинкремент фактически требует сохранения копии старого значения переменной, поскольку это значение выражение, с которым связаны некоторые расходы, см. Преинкремент быстрее, чем постинкремент в C ++ — правда? Если да, то почему?).
counter ++ делает счетчик увеличения копии и возвращает значение
++counter увеличивает счетчик и возвращает счетчик.
В цикле
for(initialization;condition;increment/decrement)
{body;}
инкремент / декремент — последняя строка цикла. Таким образом, он начнет цикл снова, когда приращение / уменьшение возвращает значение. Таким образом, постинкремент или преинкремент здесь не повлияет. Видеть это
В чем разница между прединкрементным и постинкрементным циклом (для / во время)?